Скажем, у меня есть Simple Factory (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;
}
}
Этот Factory используется некоторым клиентом, который обрабатывает данные времени выполнения, содержащие условие, подобное этому:
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 inteface)?
Должен ли я использовать конструкцию 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, но не смог подгонять их и их ответы к моим потребностям.)