C# 统一工厂注射剂

C# 统一工厂注射剂,c#,unity-container,castle,C#,Unity Container,Castle,我有一个像下面这样的接口,我把它注入unity容器中 public interface IMyInstanceFactory { IEnumerable<IMyInstance> GetAll(); } …在我的引导程序中,我做了如下操作: container.RegisterType<IMyInstance,MyInstance1>; container.RegisterType<IMyInstance,MyInstance2>; containe

我有一个像下面这样的接口,我把它注入unity容器中

public interface IMyInstanceFactory
{
    IEnumerable<IMyInstance> GetAll();
}
…在我的引导程序中,我做了如下操作:

container.RegisterType<IMyInstance,MyInstance1>;
container.RegisterType<IMyInstance,MyInstance2>;
container.RegisterType<IMyInstance,MyInstance3>;
container.RegisterType<IMyInstanceFactory,MyInstanceFactory>;

我知道castle可以做到这一点,Unity可以做类似的事情吗?

将容器传递给工厂并没有什么错,如果工厂作为一个单例公开,这样就可以很好地获得实例,而不需要再次传递容器

另一种选择是在工厂中使用服务定位器解析容器,因为定位器是单例的,所以这种方法类似于前者

有。它将生成接口的实现,并为您执行
ResolveAll

您的引导代码应该如下所示:

container.RegisterType<IMyInstance,MyInstance1>;
container.RegisterType<IMyInstance,MyInstance2>;
container.RegisterType<IMyInstance,MyInstance3>;
container.RegisterType<IMyInstanceFactory,MyInstanceFactory>;
container.RegisterType(“1”);
容器。注册表类型(“2”);
容器。注册表类型(“3”);
RegisterType(新的TypedFactory());
GetAll
的调用将转换为容器调用
ResolveAll


端口遵循为Windsor描述的相同约定。

如果您的工厂真的只是这么做,为什么不直接使用unity容器呢?或者,如果您不希望您的代码依赖于Unity,您可以使用IServiceLocator。请不要使用ServiceLocator。这是在现代应用程序架构中。如果你实现了一个基于容器的工厂,你应该注意你把工厂放在哪里。请参阅关于的段落。@SebastianWeber:即使工厂是在合成根目录中合成的,您仍然必须以某种方式从应用程序中访问它。这就是为什么我提到单身。我不认为除了这三个选项之外还有任何其他选项:我提到的两个(依赖于容器的工厂,作为单例公开,而不是不依赖于容器并直接访问服务定位器的临时工厂)和不实用的一个(对容器有明确依赖性的瞬态工厂)。为什么对容器具有依赖关系的临时工厂不可求解?将工厂设置为合成根目录中的私有类。从接口映射到该实现。Unity在容器中注册自身。当您解析私有实现时,容器将被注入其中。您的应用程序只有dependencie“@SebastianWeber:在没有容器的情况下如何解析?从某种意义上说,我在任意的类Bar中有一个任意的方法Foo,我想解析工厂?我必须使Bar依赖于容器或组合根(如果条在库中很深,且合成根位于主模块中,则不可能实现此功能)。抱歉,我不明白你的意思。你应用程序中的某些组件依赖于factory接口。在合成根中,你注册所有依赖项,解析应用程序的根对象,容器负责为你创建对象,并在适当的情况下注入它们。容器本身不会出现在外部的任何地方组合根目录。它会将私有工厂实现注入使用者,使用者只会看到工厂接口,而不会看到实现。好的,但如何注册实际工厂?--比如,对于没有公共构造函数的类,(并且您不想注册特定实例)--如何注册Func,以便容器在需要时可以从头创建对象。@BRAINSLAG83您可以使用常规工厂,方法是使用
InjectionFactory
var container=new UnityContainer();container.RegisterType(new InjectionFactory(c=>Foo.create());IFoo Foo=container.Resolve();公共类Foo:IFoo{private Foo(){}公共静态Foo Create(){return new Foo();}}}
container.RegisterType<IMyInstanceFactory,factory=>factory.GetAll()>().IsResolvedBy(unity.ResolveAll<IMyInstance>);