我有一个class A{} class B:A{} class C:A{}和class D{} D有需要使用B的方法和需要使用C的方法。
将来,我可能会有更多继承自A的类,D将需要使用这些类。
如果D有一个构造函数,如:
D(B b, C c)A应该得到一个简单的工厂(F),它将返回正确的类。然后构造函数将是public D(F f)F将有一个获得枚举并返回正确类型的CreateInstance方法。
完全注入将保持所有的组合根。简单的工厂将简化构造函数。
发布于 2016-07-21 10:22:33
您需要注意的问题是通过工厂方法引入不透明的依赖关系。
此时,D依赖于B和 C。使用如下构造函数:
public D(B b, C c)
{
}使依赖项透明。也就是说,很明显这个类需要做它的工作,并且可以直接提供这些东西。此外,自动化测试更容易一些,因为您可以直接提供假货,而不必提供提供其他假货的假工厂。
使用工厂降低了这种清晰度,但减少了必须传递的依赖项的数量,从而增加了方便性和某种程度的未来防伪。
就我个人而言,我会坚持直接提供依赖关系,直到构造器签名变得难以处理,或者显然需要更高级别的抽象(比如工厂)。类依赖于( B 和 C )这一事实发出了一个清晰的设计信息,即像工厂这样的抽象可能会模糊。
发布于 2016-07-21 06:50:01
在我看来,在B和C实现相同接口的情况下,正确的方法是传递一个factory。另外,我避免依赖于具体的类型,而是依赖于接口。如果您必须具体地获得这2,那么或者为彼此添加接口并依赖于该接口,或者选择工厂。
public enum XTypes
{
A,B,C...
}
public interface IXFactory
{
IX GetX(XTypes xType);
}
public interface IX
{
void SomeMethod()
}
//And I'd do A as an abstract class and rename to XBase
public class A : IX
{
public void SomeMethod() {}
}
public class D
{
public D(IXFactory xFactory)
{
XFactory = xFactory;
}
public void SomeMethod()
{
var x1 = XFactory.GetX(XTypes.A);
var x2 = XFactory.GetX(XTypes.C);
}
public IXFactory XFactory { get; set; }
}我个人不会在下列情况下设立工厂:
IEnumerable<IDependency> )。此外,让IX本身声明什么是他的密钥(在本例中是enum),这样工厂的实现就很干净了。
也是--在Castle Windosr中(我肯定在其他Ioc容器中也有),您可以通过实现ITypedFactoryComponentSelector来操作TypedFactoryFacility,然后您甚至不需要自己实现工厂。
*如果您有一个对象而不是enum,您可以将IX更改为IX<XRequestBase>,然后TypedFactoryFacility将自动映射和工作:)
https://stackoverflow.com/questions/38496646
复制相似问题