在DI原则下应该注入什么样的C’tor参数?

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

  1. 如果我有一些List (作为数据字段),它包含在运行时收集的信息。 似乎我应该在c’tor中启动它而不是注入它。

但是通过COM端口进行通信的硬件类呢?

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

  1. 如果需要注入上述SerialPort; 最好的方法是什么?

我手动创建它:

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

或使用Unity容器

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

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

adiel

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

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

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

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

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

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