C# 良好的构造设计
一般来说,在构造函数中构造其他对象是一个坏主意吗(我通常不喜欢它)?假设一个类型A的对象需要一个类型B的实例。类型B的实例应该是静态的,因为我真的只需要它的一个副本…真的…不,说真的。类型b还引发类型A需要处理的事件。类型B位于我无法控制的外部库中。使我的B型对象保持静态似乎是测试中的一个麻烦。我最初想做一个完全静态的,因为它本质上是B的代理。也许这才是真正的问题。当作为代理的对象需要初始化时,什么是好的代理设计?我至少可以想到三种选择:C# 良好的构造设计,c#,oop,design-patterns,constructor,proxy-pattern,C#,Oop,Design Patterns,Constructor,Proxy Pattern,一般来说,在构造函数中构造其他对象是一个坏主意吗(我通常不喜欢它)?假设一个类型A的对象需要一个类型B的实例。类型B的实例应该是静态的,因为我真的只需要它的一个副本…真的…不,说真的。类型b还引发类型A需要处理的事件。类型B位于我无法控制的外部库中。使我的B型对象保持静态似乎是测试中的一个麻烦。我最初想做一个完全静态的,因为它本质上是B的代理。也许这才是真正的问题。当作为代理的对象需要初始化时,什么是好的代理设计?我至少可以想到三种选择: 传入参数需要构造类型A和类型B。 然后,类型A的构造函数
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;
更新:
我在一篇评论中提到了一个答案。我熟悉DI、IoC、工厂方法、构建器模式、构造函数注入、方法注入、属性注入、测试驱动设计等。我想我的问题是,我如何平衡简单性和良好的设计,同时尽可能少、尽可能快地根据我当前的需求编写代码类B永远不会被替换,我没有理由相信除了类A之外的任何东西都会在我的项目中使用类B。我有点担心测试的接缝,但类A非常简单,代码很少,基本上包装了一个第三方类。如果你真的只需要一个类型B的实例,那你为什么要处理它它应该是B类的一个类成员,你可以随时从B类获得它。A类的实例不需要它自己指向B的指针(而且它拥有自己的B实例是没有意义的,因为只有一个实例)最终使用构造函数注入使用DI。虽然不是非常激动,但这似乎是最直接的方法。依赖对象应该在构造时传入/注入到对象中。使用工厂方法封装需要大量依赖项的对象的复杂构造。构造函数签名e指的是接口,而不是具体。我理解您对选项2的问题,但这些都是错误的考虑。看看依赖注入,例如选项2(传入构造的对象)在我看来,这是一种方式。那么呢?这些类不需要多态性,我希望它们紧密耦合。为什么担心是错误的?也许我的文本不太清楚。类A包含类B的一个实例。我不能修改类B。