假设一个对象Abc
取决于树服务:IService1
,IService2
和IService3
。如果使用构造函数依赖项注入,则可以测试对象Abc
。
public class Abc : IAbc
{
public Abc(IService1 s1, IService2 s2, IService3 s3)
{
...
}
}
如果Abc
是另一个对象的依赖项(我们称其为Ab
),则Ab
可以提供以下服务:Service1
,Service2
和Service3
。但是,由于我感觉Ab
不应该知道Abc
所依赖的服务,因此我认为需要一个工厂来创建Abc
。
public class AbcFactory : IAbcFactory { public IAbc Create() { IService1 s1 = new Service1(); IService2 s2 = new Service2(); IService3 s3 = new Service3(); return new Abc(s1, s2, s3); } }
对于工厂,Ab
至少仅取决于此工厂接口IAbcFactory
。
public class Ab : IAb { IAbc abc; public Ab(IAbcFactory abcFactory) { this.abc = abcFactory.Create(); } public DoSomethingWithAbc() { ... } }
[如果我进一步说Ab
是另一个对象A
的依赖项,那么我可以再次使用工厂来创建Ab
。但这是我开始怀疑是否有意义的点,基本上为每个类创建一个我都需要一个工厂和一个相应的接口。[在尝试找到解决方案时,我遇到了依赖注入(DI)框架,例如SimpleInjector。使用那些DI框架,我可以传递一个容器,然后从该容器(而不是工厂)中创建类。然而;然后我将所有类都绑定到我无法控制的第三方框架。
创建所有此类依赖项的最佳实践是什么?
创建所有此类依赖项的最佳实践是什么?
嗯...您刚刚列出了它们。
在我工作的较大型软件应用程序中,我们实际上同时使用了这两种软件。视图和视图模型的DI,我们的服务是手动创建的。这是因为如果您可以访问DI容器,则意味着您可以从那里抓取任何东西,即使是不应该位于较高层的低级对象,例如我不希望通过用户界面直接访问数据库,在两者之间有一层可以处理。
这取决于您的体系结构,但是我们通过简单地传递的应用程序/引导程序类创建所有服务:
CarApplication
{
public IService MyService1 {get; set;}
public IService MyService2 {get; set;}
public IService MyService3 {get; set;}
public void Init()
{
MyService1 = new Service1();
MyService2 = new Service1();
MyService3 = new Service3(service1, service2);
}
}
...
// We then simply pass CarApplication around to classes that need access to dependencies.