Ответ 1
Я нашел ответ сам! Вот решение:
ObjectFactory.With("connectionString").EqualTo(someValueAtRunTime).GetInstance<IProductProvider>();
Надеюсь, это поможет другим, кто столкнулся с одной и той же проблемой.
Я использую StructureMap для своего DI. Представьте, что у меня есть класс, который принимает один аргумент, например:
public class ProductProvider : IProductProvider
{
public ProductProvider(string connectionString)
{
....
}
}
Мне нужно указать "connectionString во время выполнения, когда я получу экземпляр IProductProvider.
Я сконфигурировал StructureMap следующим образом:
ForRequestedType<IProductProvider>.TheDefault.Is.OfConcreteType<ProductProvider>().
WithCtorArgument("connectionString");
Однако я не хочу вызывать метод EqualTo ( "something..." ) здесь, поскольку мне нужно некоторое средство для динамического указания этого значения во время выполнения.
Мой вопрос: как я могу получить экземпляр IProductProvider с помощью ObjectFactory?
В настоящее время у меня есть что-то вроде:
ObjectFactory.GetInstance<IProductProvider>();
Но, как вы знаете, это не работает...
Любые советы будут очень признательны.
Я нашел ответ сам! Вот решение:
ObjectFactory.With("connectionString").EqualTo(someValueAtRunTime).GetInstance<IProductProvider>();
Надеюсь, это поможет другим, кто столкнулся с одной и той же проблемой.
Я предлагаю объявить это с помощью конфигурации StructureMap. Использование немного более нового кода StructureMap:
For<IProductProvider>().Use<ProductProvider>
.Ctor<string>("connectionString").Is(someValueAtRunTime);
Таким образом, вы не обременяете свой код клиента тем, что знаете его значение, и можете сохранить свою конфигурацию IoC отдельно от вашего основного кода.