Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 良好的构造设计_C#_Oop_Design Patterns_Constructor_Proxy Pattern - Fatal编程技术网

C# 良好的构造设计

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的构造函数

一般来说,在构造函数中构造其他对象是一个坏主意吗(我通常不喜欢它)?假设一个类型A的对象需要一个类型B的实例。类型B的实例应该是静态的,因为我真的只需要它的一个副本…真的…不,说真的。类型b还引发类型A需要处理的事件。类型B位于我无法控制的外部库中。使我的B型对象保持静态似乎是测试中的一个麻烦。我最初想做一个完全静态的,因为它本质上是B的代理。也许这才是真正的问题。当作为代理的对象需要初始化时,什么是好的代理设计?我至少可以想到三种选择:

  • 传入参数需要构造类型A和类型B。 然后,类型A的构造函数构造类型B。(调用create方法从构造函数中返回类型B将是相同的基本概念
  • 传入构造的对象
  • 创建一个初始化方法
  • 我不喜欢选项1,因为它太复杂了。我需要做各种类型的B初始化代码,设置事件处理程序,等等。 我不喜欢选项2,因为我不想让外界知道这个依赖关系。类A是唯一会与类B交互的类型。 一般来说,我不喜欢初始化方法,也不喜欢“保护”封装依赖项状态的方法。我似乎最终得到了很多这样的代码:

    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。