Get a list of all registered objects implementing a certain interface

前端 未结 6 1888
失恋的感觉
失恋的感觉 2020-12-05 05:23

Consider the following

builder.Register(c => new A());
builder.Register(c => new B());
builder.Register(c => new C());

B

6条回答
  •  一个人的身影
    2020-12-05 06:00

    I needed to resolve based on some context. So slight variation...

     builder.RegisterAssemblyTypes(Assembly.GetAssembly(typeof(ISomeStrategy)))
       .Where(t => typeof(ISomeStrategy).IsAssignableFrom(t))
       .AsSelf();
    
     builder.Register>(c =>
     {
        var types = c.ComponentRegistry.Registrations
          .Where(r => typeof(ISomeStrategy).IsAssignableFrom(r.Activator.LimitType))
          .Select(r => r.Activator.LimitType);
    
        ISomeStrategy[] lst = types.Select(t => c.Resolve(t) as ISomeStrategy).ToArray();
    
        return (someEnum) =>
        {
          return lst.FirstOrDefault(x => x.CanProcess(someEnum));
        };
     });
    

    Then for your class using the strategy

     public SomeProvider(Func someFactory)
     {
        _someFactory = someFactory;
     }
    
     public void DoSomething(SomeType someType)
     {
        var strategy = _someFactory(someType);
        strategy.DoIt();
     }
    

提交回复
热议问题