Использование имен для различения экземпляров с помощью IoC

Я пробую Ninject и модифицирую код, который я написал с помощью карты структуры, чтобы увидеть, насколько это просто. В этом базовом коде у меня есть граф объектов, которые имеют разные конфигурации через реестры карты структуры, и тот, который нужно использовать, выбирается во время выполнения через значение в базе данных (в этом случае для возврата тела службы wcf с некоторыми введенными объектами) . Так, например (с использованием кода карты структуры):

Реестр 1 устанавливает все значения по умолчанию для типов IBusinessContext, IRules и ILogger. Это просто добавление типов GenericContext / Logger / Rules вместе с интерфейсами без какой-либо другой специализации.

public GenericRegistry()
    {
        // Set up some generic bindings here
        For<ILogger>().Use<Loggers.GenericLogger>();
        For<IBusinessRule>().Use<Rules.StandardRule>();
        For<IBusinessContext>().Use<Contexts.GenericBusinessContext>();
        For<ILoggerContext>().Use<Loggers.GenericLoggerContext>();
    }

Реестр 2 настраивает IBusinessContext для использования класса SpecialisedContext и сообщает ctor использовать SpecializedLogger. Экземпляр для IBusinessContext называется SpecializedContext.

public SpecializedRegistry()
    {
        // Old style syntax as it affects the default for IBusinessContext
        // Perhaps a hint at what I'm doing?
        InstanceOf<IBusinessContext>().Is.OfConcreteType<Contexts.SpecializedBusinessContext>().Named(SpecializedInstanceName).Ctor<ILogger>().Is<Loggers.SpecialisedLogger>();
    }

Все это работает должным образом в Structure Map (в зависимости от старого или нового синтаксиса).

Однако, когда я использовал Ninject, у меня возникла проблема с ожиданием, что безымянный экземпляр будет использоваться по умолчанию (не то, как работает Ninject, я понимаю). Это привело к некоторым исследованиям, которые показали, что использование именованных экземпляров - действительно плохая идея.Я понимаю, что есть более эффективные способы сделать это, используя автоматическую регистрацию или атрибуты для установки имени или запроса определенного типа, но в системе, которую я описываю, должен быть способ во время выполнения выяснить, какую конфигурацию запрашивать в верхней части дерева (и пусть структура IoC выяснит остальное на основе зарегистрированных типов или правил).

Итак ... я просто неправильно использую концепцию IoC, ожидая, что буду запрашивать мой объект верхнего уровня по имени, или есть вообще лучший способ сделать то, что я пытаюсь сделать? Должен ли я вместо этого использовать что-то вроде MEF и рассматривать все это как плагины?

Я подчеркиваю, что я не использую это как тупую фабрику и не запрашиваю на каждом уровне кода экземпляр типа x из контейнера, это только начальное действие.

Заранее благодарим за ваше время и помощь :)

6
задан NoodleAwa 14 February 2012 в 21:44
поделиться