一般来说,在构造函数中构造其他对象是不是一个坏主意(我通常不喜欢它)?假设类型A的对象需要类型B的实例。类型B的实例应该是静态的,因为我真的只想要它的一个副本......真的......不,认真。类型b还引发类型A需要处理的事件。 B型是在我无法控制的外部库中。使我的B型对象静态似乎对测试很烦人。我本来想让A完全静止,因为它本质上是B的代理。也许这是真正的问题。当代理对象需要初始化时,什么是良好的代理设计?我至少可以想到三个选择:
我不喜欢选项1,因为它很复杂。我必须做各种类型的B初始化代码,设置事件处理程序等。 我不喜欢选项2,因为我不希望外面的世界知道这种依赖。 A类是与B类交互的唯一类型。 一般来说,我不喜欢初始化方法或方法,以及#34;守护"封装依赖的状态。我似乎最终得到了很多像这样的代码:
if (typeB != null && typeB.State != Unitialized)
呸。
以下是我正在使用的一些示例代码。只是在寻找如何使它真正干净,简单和易于维护。
public class A
{
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private B b;
public new A(string productName, string serviceName)
{
b = new B
{
ProductName = productName,
ServiceName = serviceName
};
b.SomethingHappened += b_HandleIt;
更新 我在回答的评论中引用了this pragmatic article。我熟悉DI,IoC,工厂方法,构建器模式,构造函数注入,方法注入,属性注入,测试驱动设计等。我想我的问题是,如何在编码时平衡简单性和良好的设计尽可能快地满足我目前的需求? B级永远不会被替换,我没有理由相信任何东西,除了A级将在我的项目中使用B级。我有点担心测试接缝,但A类非常简单,代码很少,基本上包装了第三方类。
答案 0 :(得分:0)
使用构造函数注入结束DI。并不是非常兴奋,但它似乎是最直接的方法。
答案 1 :(得分:-1)
如果你真的只需要一个b类型的实例,那你为什么要把它作为A的构造的一部分呢?它应该是B类的类成员,您可以在需要时从B类中获取它。类A的实例不需要自己的指向b的指针。 (并且它拥有自己的b实例是没有意义的,因为只有一个实例。)