Справка по именованным экземплярам StructureMap IOC
Возникла проблема с StructureMap IOC. Я хочу получить разные конкретные реализации объектов, которые реализуют один и тот же интерфейс на основе меток или имен.
internal static class InstanceHelper
{
internal enum Taxonomy
{
Foo,
Bar
}
static InstanceHelper()
{
// Initialize the container
ObjectFactory.Initialize(x =>
{
x.For<IMyInterface>().Use<ObjectA>().Named(Taxonomy.Foo.ToString());
x.For<IMyInterface>().Use<ObjectB>().Named(Taxonomy.Bar.ToString());
});
}
internal static IMyInterface GetInstanceByTaxonomy(Taxonomy taxonomy)
{
// this raises an exception
ObjectFactory.GetNamedInstance<IMyInterface>(taxonomy.ToString());
}
}
Документация не очень хороша в этом отношении, кажется, что все примеры там устарели... используя версию 2.6.1.0
Благодарю.
2 ответа
И оригинальный способ, и способ amarsuperstar, похоже, действительно работают, проблема заключалась в том, что область действия класса ObjectA была объявлена как внутренняя, вместе с внутренним конструктором. Я изменил это на Public, и теперь IOC может видеть это... обратное отражение происходит в сборке StructureMap. Дох глупо меня.
Ты используешь AddInstances
способ добавить ваши именованные экземпляры
ObjectFactory.Initialize(x =>
{
x.For<IMyInterface>().AddInstances(i =>
{
i.Type<ObjectA>().Named("Foo");
i.Type<ObjectB>().Named("Bar");
});
});
Это работает для меня, однако я согласен, что документация может иногда вводить в заблуждение между версиями, и мне потребовалось некоторое время, чтобы добраться до этого в первый раз.