假设我有一个使用条件参数来确定如何创建s的简单工厂 ( SimpleProductFactory
) ,如下所示:Product
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 实现相同的构造行为?
重要的部分是条件 ( Condition
) 确定如何创建和设置Product
,并且条件仅在运行时已知并且每次MakeProduct(...)
调用都不同。(“其他产品设置代码”处理一些委托内容,但也可能处理其他初始化,并且需要成为构造的一部分。)
Product
(或 IProduct 接口)的容器注册应该如何完成?
我应该使用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 上阅读了很多类似的问题,但无法根据我的需要来满足它们以及它们的答案。)