Справка по именованным экземплярам StructureMap IOC - PullRequest
3 голосов
/ 24 сентября 2010

Возникла проблема с 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 ]

1 голос
/ 24 сентября 2010

Вы используете метод AddInstances для добавления именованных экземпляров

ObjectFactory.Initialize(x =>
{
    x.For<IMyInterface>().AddInstances(i =>
    {
        i.Type<ObjectA>().Named("Foo");
        i.Type<ObjectB>().Named("Bar");
    });
});

Это работает для меня, однако я согласен, что документация иногда может вводить в заблуждение между версиями, и мне потребовалось некоторое время, чтобы добраться до этого в первый раз.

0 голосов
/ 24 сентября 2010

Как оригинальный способ, так и способ amarsuperstar, похоже, действительно работают, проблема заключалась в том, что область действия класса ObjectA была объявлена ​​как внутренняя вместе с внутренним конструктором. Я изменил это на Public, и теперь IOC может видеть это ... обратное отражение происходит в сборке StructureMap. Дох глупо меня.

...