在DI原则下应该注入什么作为Ctor参数?

时间:2010-07-29 11:24:39

标签: c# dependency-injection unity-container ioc-container

我试图了解应该将哪些对象注入对象以及应该在内部创建哪些对象。

  1. 如果我有一些List<int>(作为数据字段),它包含在运行时收集的信息。似乎我应该在c'tor中启动它而不是注入它。
  2. 但是通过COM端口进行通信的硬件类呢。

    我让HW类初始化SerialPort还是我注入它?

    1. 如果需要注入上述SerialPort;什么是最好的方法呢?
    2. 我手动创建它:

      SerialPort port = new SerialPort(name, baud ...);
      
      HWClass hwClass = container.Reolve<IHWClass>("HWClass", new InjectionConstructor(port));
      

      或使用Unity容器

      SerialPort port = conatiner.Resolve<SerialPort>(...);
      
      HWClass hwClass = container.Reolve<IHWClass>("HWClass", new InjectionConstructor(port));
      

      或者我应该在HWClass C'tor内部启动它吗?

      adiel

2 个答案:

答案 0 :(得分:4)

Domain-Driven Design区分服务和其他域对象(实体值对象)。即使您没有订阅DDD,这种区别也非常有用。

服务通常是长期无状态的对象,可以为其消费者执行操作。它们是典型的依赖关系,您可以从注入中获益匪浅。

在你的情况下,SerialPort和IHwClass听起来非常像服务,因为它们代表外部资源,所以我肯定通过构造函数注入注入

但是,如果您注入抽象,那么您只能真正获得松耦合的好处。 IHWClass看起来很好,因为它是一个接口,但SerialPort看起来像一个具体的类,所以你注入它不会获得太多。 从SerialPort中提取接口(例如,ISerialPort)并注入它会更好。

答案 1 :(得分:2)

我的一般规则是,如果对象可以从类外部更改状态,或者您希望能够在测试中或在将来的某个时间点动态地提供备用实现,则应该注入它。如果只在内部使用和修改类,并且实现仅依赖于包含类,那么在内部创建依赖项可能没问题。要使用您的示例,我会注入SerialPort,而不是List<int>

顺便说一下,现在我做TDD(测试驱动开发),我发现我真的不太担心这些决定。您很快就会知道需要注入哪些类才能将类分离以使测试更容易。即使你最初没有把它弄好,在几次测试中你会发现你的代码在这个方向上自然发展。