缩放对象的创建(在TDD环境中)[关闭]

问题描述 投票:-1回答:1
我在TDD环境中创建对象时遇到了麻烦;如果对象相互依赖,不止一个对象,则可以缩放该对象的创建。

假设一个对象Abc取决于树服务:IService1IService2IService3。如果使用构造函数依赖项注入,则可以测试对象Abc

public class Abc : IAbc { public Abc(IService1 s1, IService2 s2, IService3 s3) { ... } }

如果Abc是另一个对象的依赖项(我们称其为Ab),则Ab可以提供以下服务:Service1Service2Service3。但是,由于我感觉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框架,我可以传递一个容器,然后从该容器(而不是工厂)中创建类。然而;然后我将所有类都绑定到我无法控制的第三方框架。

创建所有此类依赖项的最佳实践是什么?

c# new-operator
1个回答
0
投票
创建所有此类依赖项的最佳实践是什么?

嗯...您刚刚列出了它们。

    使用DI框架
  1. 使用构造函数注入。
  • 这就是它真正完成的方式。您需要在某个地方创建这些服务,还需要将其传递给相关类-某个地方。您可以自己注入它们,也可以为您提供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.

  • © www.soinside.com 2019 - 2024. All rights reserved.