c# – 具有参数条件的Simple Factory,使用Unity 2.0

假设我有一个Simple Factory(SimpleProductFactory),它使用一个condition参数来确定如何创建这样的产品:
public static class SimpleProductFactory
{
    public static Product MakeProduct(Condition condition)
    {
        Product product;
        switch(condition)
        {
            case Condition.caseA:
                product = new ProductA();
                // Other product setup code
                break;
            case Condition.caseA2:
                product = new ProductA();
                // Yet other product setup code
                break;
            case Condition.caseB:
                product = new ProductB();
                // Other product setup code
                break;
        }
        return product;
    }
}

该工厂由一些客户端使用,用于处理包含以下条件的运行时数据:

public class SomeClient
{
    // ...
    public void HandleRuntimeData(RuntimeData runtimeData)
    {
        Product product = SimpleProductFactory.MakeProduct(runtimeData.Condition);
        // use product...
    }
    // ...
}

public class RuntimeData
{
    public Condition Condition { get; set; }
    // ...
}

如何使用Unity 2.0实现相同的构造行为?
重要的部分是条件(条件)决定了如何创建和设置产品,并且条件仅在运行时已知,并且对于每个MakeProduct(…)调用而言是不同的. (“其他产品设置代码”涉及一些代理的东西,但也可以处理其他初始化,并且需要作为构建的一部分.)

产品注册(或产品介面)应如何进行?
我应该使用一个InjectionFactory结构吗?我怎么做?

// How do I do this?
container.RegisterType<Product>(???)

我需要做些什么才能在客户端代码中提供条件?

最初的客户端代码(来自以前的编辑),以突出显示最后一个问题,这解释了几个答案的措辞:

public class SomeClient
{
    // ...
    public void HandleRuntimeData(RuntimeData runtimeData)
    {
        // I would like to do something like this,// where the runtimeData.Condition determines the product setup.
        // (Note that using the container like this isn't DI...)
        Product product = container.Resolve<Product>(runtimeData.Condition);
        // use product...
    }
    // ...
}

(我已经在Stackoverflow看过很多类似的问题,但是还没有能够适应他们,他们的答案满足了我的需要.)

解决方法

您不应该使用容器来执行这样的运行时决策.而是通过容器将您的工厂注入客户端.如果工厂需要集装箱的配件,在创建时将其注入工厂.

将工厂更改为实际对象,而不是仅仅是静态方法的容器,并注入它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


c语言数组越界会怎么样
c语言指针怎么等于数组
c语言数组怎么存入文字
c语言中怎么显示数组
c语言数组元素怎么选
c语言数组怎么累加
c语言数组符号怎么输入
c语言怎么用长数组
c语言数组函数怎么输入
c语言数组怎么去掉差异
c语言怎么求解数组
c语言数组怎么用变量
c语言怎么申明数组
c语言怎么控制数组
c语言怎么计算数组长度
c语言数组怎么插星号
c语言数组怎么加长度
c语言中怎么输出数组
c语言怎么记住数组边界
c语言数组怎么输入符号