在DI原则下应该注入什么样的C’tor参数?
我试图了解应该将哪些对象注入对象以及哪些对象应该在内部创建。
- 如果我有一些
List
(作为数据字段),它包含在运行时收集的信息。 似乎我应该在c’tor中启动它而不是注入它。
但是通过COM端口进行通信的硬件类呢?
我让HW类初始化SerialPort还是我注入它?
- 如果需要注入上述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(测试驱动开发),我发现我真的不太担心这些决定。 您很快就会知道需要注入哪些类才能将类拆分以使测试更容易。 即使您最初没有做到正确,但在一些测试中,您会发现您的代码自然会朝着这个方向发展。