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取决于B和C。使用类似以下的构造函数:
public D(B b, C c)
{
}
使依赖项透明。也就是说,很清楚这个类需要做什么,这些东西可以直接提供。此外,自动化测试更容易一些,因为您可以直接提供假货,而无需提供提供其他假货的假工厂
使用工厂降低了这种清晰性,但通过减少必须传递的依赖项的数量,增加了便利性和一定程度的未来证明
就我个人而言,我会坚持直接提供依赖项,直到构造函数签名变得笨拙或显然需要更高级别的抽象(如工厂)。类既依赖于B
又依赖于C
这一事实发出了一个清晰的设计信息,像工厂这样的抽象可能会模糊它。这里需要注意的问题是通过工厂方法引入不透明的依赖关系
此时,D取决于B和C。使用类似以下的构造函数:
public D(B b, C c)
{
}
使依赖项透明。一、 e.很清楚这个班需要做什么,这些东西可以直接提供。此外,自动化测试更容易一些,因为您可以直接提供假货,而无需提供提供其他假货的假工厂
使用工厂降低了这种清晰性,但通过减少必须传递的依赖项的数量,增加了便利性和一定程度的未来证明
就我个人而言,我会坚持直接提供依赖项,直到构造函数签名变得笨拙或显然需要更高级别的抽象(如工厂)。类同时依赖于B
和C
这一事实发出了一个清晰的设计信息,像工厂这样的抽象可能会模糊它。类a