Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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/8/design-patterns/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# 简单工厂与IOC_C#_Design Patterns_Inversion Of Control_Factory - Fatal编程技术网

C# 简单工厂与IOC

C# 简单工厂与IOC,c#,design-patterns,inversion-of-control,factory,C#,Design Patterns,Inversion Of Control,Factory,我有一个类a{}类B:a{}类C:a{}和类D{} D有需要使用B的方法和需要使用C的方法 将来我可能会有更多的类继承自A,而D将需要使用这些类 D是否应该有如下构造函数: 公共D(B、B、C) 或者A是否应该获得一个简单的工厂(F),该工厂将返回 正确的班级。然后构造函数将是public D(F F) F将有一个CreateInstance方法,该方法将获取enum并返回正确的类型 完全注入将使所有成分保持在根中。 简单工厂将简化构造函数。在我看来,在B和C实现相同接口的情况下,正确的方法是通

我有一个
类a{}
类B:a{}
类C:a{}
类D{}
D有需要使用B的方法和需要使用C的方法

将来我可能会有更多的类继承自
A
,而
D
将需要使用这些类

D
是否应该有如下构造函数:

  • 公共
    D(B、B、C)

  • 或者
    A
    是否应该获得一个简单的工厂
    (F)
    ,该工厂将返回 正确的班级。然后构造函数将是
    public D(F F)

  • F
    将有一个
    CreateInstance
    方法,该方法将获取enum并返回正确的类型

    完全注入将使所有成分保持在根中。
    简单工厂将简化构造函数。

    在我看来,在B和C实现相同接口的情况下,正确的方法是通过
    工厂。此外,我还避免依赖于具体类型,而是依赖于接口。如果您必须特别获得这2个接口,则可以为每个接口添加,并依赖于该接口,或者选择工厂

    (有关更完整的示例,请参见)

    在以下情况下,我个人不会将工厂投入使用:

  • 我只需要在程序的整个生命周期中实现一个特定的依赖项
  • 我需要该依赖关系的所有实现,并执行所有这些实现(仅依赖于
    IEnumerable
  • 整个代码中只有该依赖项的一个实现(添加工厂很容易,所以有一天我可能需要添加工厂)

  • 此外,最好让
    IX
    本身声明他的密钥是什么(在本例中是
    enum
    ),然后工厂的实现非常干净

    同样-在
    Castle Windosr
    中(我确信在其他Ioc容器中也有),有一个
    类型工厂设施
    ,您可以通过实现
    ITypedFactoryComponentSelector来操作,然后您甚至不需要自己实现工厂


    *如果您将拥有一个对象,而不是
    enum
    ,您可以将
    IX
    更改为
    IX
    ,然后
    TypedFactoryFacility
    将自动映射并工作:)

    在我看来,在B和C实现相同接口的情况下,正确的方法是通过
    工厂。此外,我还避免依赖于具体类型,而是依赖于接口。如果您必须特别获得这2个接口,则可以为每个接口添加,并依赖于该接口,或者选择工厂

    (有关更完整的示例,请参见)

    在以下情况下,我个人不会将工厂投入使用:

  • 我只需要在程序的整个生命周期中实现一个特定的依赖项
  • 我需要该依赖关系的所有实现,并执行所有这些实现(仅依赖于
    IEnumerable
  • 整个代码中只有该依赖项的一个实现(添加工厂很容易,所以有一天我可能需要添加工厂)

  • 此外,最好让
    IX
    本身声明他的密钥是什么(在本例中是
    enum
    ),然后工厂的实现非常干净

    同样-在
    Castle Windosr
    中(我确信在其他Ioc容器中也有),有一个
    类型工厂设施
    ,您可以通过实现
    ITypedFactoryComponentSelector来操作,然后您甚至不需要自己实现工厂


    *如果您将拥有一个对象而不是
    enum
    ,您可以将
    IX
    更改为
    IX
    ,然后
    TypedFactoryFacility
    将自动映射并工作:)

    您需要注意的问题是通过工厂方法引入不透明的依赖关系

    此时,D取决于BC。使用类似以下的构造函数:

    public D(B b, C c)
    {
    }
    
    使依赖项透明。也就是说,很清楚这个类需要做什么,这些东西可以直接提供。此外,自动化测试更容易一些,因为您可以直接提供假货,而无需提供提供其他假货的假工厂

    使用工厂降低了这种清晰性,但通过减少必须传递的依赖项的数量,增加了便利性和一定程度的未来证明


    就我个人而言,我会坚持直接提供依赖项,直到构造函数签名变得笨拙或显然需要更高级别的抽象(如工厂)。类既依赖于
    B
    又依赖于
    C
    这一事实发出了一个清晰的设计信息,像工厂这样的抽象可能会模糊它。

    这里需要注意的问题是通过工厂方法引入不透明的依赖关系

    此时,D取决于BC。使用类似以下的构造函数:

    public D(B b, C c)
    {
    }
    
    使依赖项透明。一、 e.很清楚这个班需要做什么,这些东西可以直接提供。此外,自动化测试更容易一些,因为您可以直接提供假货,而无需提供提供其他假货的假工厂

    使用工厂降低了这种清晰性,但通过减少必须传递的依赖项的数量,增加了便利性和一定程度的未来证明

    就我个人而言,我会坚持直接提供依赖项,直到构造函数签名变得笨拙或显然需要更高级别的抽象(如工厂)。类同时依赖于
    B
    C
    这一事实发出了一个清晰的设计信息,像工厂这样的抽象可能会模糊它。

    类a