不能合并工厂/ DI

假设我有一些类Foo,有两个依赖项:一个ISerializer<T>和一个IFileAccessHandler

现在这个类也有其他的依赖关系,函数依赖关系。 我不希望任何人在无效状态下实例化这个类,所以我也需要在构造函数中传递一个域对象。

但是我怎样才能让IoC处理,当我也知道在创buildFoo类的那一刻,什么样的域对象被传递?

我使域对象成为我由Factory设置的属性。 因此,Factory进行Service Locator调用,以获得具有相关性的正确实例化的“Foo”类,并进一步填充正确的域对象并将其返回。

但这是最好的方式吗? 我宁愿让我的构造函数的域对象部分,使其显示你真的需要与“Foo”的工作。

有任何想法吗? 我在这里错过了什么?

在注册时无法连接具体types的DI的默认解决scheme是使用抽象工厂

你的情况,我会定义一个IFooFactory接口:

 public interface IFooFactory { Foo Create(DomainClass dc); } 

这将允许您定义一个知道您的基础设施服务的具体实现。

 public class FooFactory : IFooFactory { private readonly ISerializer serializer; private readonly IFileAccessHandler fileHandler; public FooFactory(ISerializer serializer, IFileAccessHandler fileHandler) { if(serializer == null) { throw new ArgumentNullException("serializer"); } if(fileHandler == null) { throw new ArgumentNullException("fileHandler"); } this.serializer = serializer; this.fileHandler = fileHandler; } public Foo Create(DomainClass dc) { return new Foo(this.serializer, this.fileHandler, dc); } } 

通过这种方式,你可以保护你的Foo类的不变式 ,使你可以留在构造函数注入中

在DI容器中,可以注册IFooFactory和相应的实现。 无处不在,你有一个DomainClass实例,需要一个Foo实例,然后你会依赖IFooFactory并使用它。

我也在努力解决这个问题。 Mark的例子受到限制,因为FooFactory正在创build具体的类Foo。 如果要在启动configuration期间确定实现的情况下创build一个IFoo呢? 这意味着IFoo的所有替代实现(FooA,FooB等)都需要相应工厂的具体实现(FooAFactory,FooBFactory等)。 这使我感到冗余。

如果工厂的定义与集装箱的实施和初始化程度相同,我不会看到工厂参考集装箱的弱点。 它仍然保持容器的引用泄漏到您的应用程序的其余部分。

最好的祝福,

地铁。