首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单工厂和IOC

简单工厂和IOC
EN

Stack Overflow用户
提问于 2016-07-21 06:35:33
回答 2查看 193关注 0票数 0

我有一个class A{} class B:A{} class C:A{}class D{} D有需要使用B的方法和需要使用C的方法。

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

如果D有一个构造函数,如:

  1. 公共D(B b, C c)
  2. 或者A应该得到一个简单的工厂(F),它将返回正确的类。然后构造函数将是public D(F f)

F将有一个获得枚举并返回正确类型的CreateInstance方法。

完全注入将保持所有的组合根。简单的工厂将简化构造函数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-21 10:22:33

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

此时,D依赖于B C。使用如下构造函数:

代码语言:javascript
复制
public D(B b, C c)
{
}

使依赖项透明。也就是说,很明显这个类需要做它的工作,并且可以直接提供这些东西。此外,自动化测试更容易一些,因为您可以直接提供假货,而不必提供提供其他假货的假工厂。

使用工厂降低了这种清晰度,但减少了必须传递的依赖项的数量,从而增加了方便性和某种程度的未来防伪。

就我个人而言,我会坚持直接提供依赖关系,直到构造器签名变得难以处理,或者显然需要更高级别的抽象(比如工厂)。类依赖于( B C )这一事实发出了一个清晰的设计信息,即像工厂这样的抽象可能会模糊。

票数 2
EN

Stack Overflow用户

发布于 2016-07-21 06:50:01

在我看来,在B和C实现相同接口的情况下,正确的方法是传递一个factory。另外,我避免依赖于具体的类型,而是依赖于接口。如果您必须具体地获得这2,那么或者为彼此添加接口并依赖于该接口,或者选择工厂。

(更完整的示例请参见https://stackoverflow.com/questions/38481859/composite-design-pattern-how-to-pass-results-from-one-component-into-another/38481988#38481988 )

代码语言:javascript
复制
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; }
}

我个人不会在下列情况下设立工厂:

  1. 我只需要在整个程序的整个生命周期中实现特定的依赖关系。
  2. 我需要这个依赖关系的所有实现并执行它们(只需依赖于IEnumerable<IDependency> )。
  3. 在整个代码中只有一个该依赖项的实现(添加工厂很容易--因此,当有一天我可能需要时,我会添加)

此外,让IX本身声明什么是他的密钥(在本例中是enum),这样工厂的实现就很干净了。

也是--在Castle Windosr中(我肯定在其他Ioc容器中也有),您可以通过实现ITypedFactoryComponentSelector来操作TypedFactoryFacility,然后您甚至不需要自己实现工厂。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38496646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档