StructureMap Указание явных аргументов конструктора - PullRequest
6 голосов
/ 16 августа 2011

Я работаю над устаревшим кодом.

У меня есть разные методы одного и того же класса, которые передают разные аргументы конструктору зависимости. Я пытаюсь представить немного базового использования IoC. Прямо сейчас у меня есть StructureMap, передающий мои аргументы так:

var thing = ObjectFactory.GetInstance<IThingInterface>(new ExplicitArguments(
      new Dictionary<string, object> { 
          { "constructorArgA", notShown  }, 
          { "constructorArgB", redacted.Property } }));

Где фактические свойства, переданные для constructorArgA и B, меняются в зависимости от того, где я нахожусь.

Вместо "constructorArgA" есть способ настроить это через фактические типы, как вы можете сделать при настройке objectFactory, например:

x.For<IHidden>().Use<RealType>()
   .Ctor<IConfig>().Is(new Func<IContext, IConfig>(
        (context) => someMethodToGetIConfig()));

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

1 Ответ

3 голосов
/ 16 августа 2011

Это классический вопрос с DI Containers.

Мой первый выбор - создать «ручную» абстрактную фабрику для создания IThingInterface, а затем использовать Structuremap для внедрения IThingInterfaceFactory там, где это необходимо.,Под ручной фабрикой я имею в виду класс, вызывающий new ThingInterface () и возвращающий его.Если вы сделаете это таким образом, ваша реализация больше не будет управляться контейнером, и если это имеет зависимости, они больше не будут предоставляться контейнером (может быть, а может и не быть проблемой для вас).

Второй вариант - создать абстрактную фабрику, которая фактически использует / оборачивает контейнер.Итак, в основном ваш первый фрагмент кода, но заключенный в фабричный класс, где метод Create () принимает ваши параметры.Это имеет преимущество в том, что все (включая вашу реализацию и ее зависимости) управляются контейнером, но недостатком является прямая ссылка на ваш контейнер (что не является наилучшей практикой - см. Статья о корнях композиции ).

Вы могли бы также сделать инъекцию сеттера, но я лично считаю это последним средством.

В Castle Windsor есть хорошее решение этой проблемы, встроенное ( Typed Factory Facility ),Не уверен, если переключение контейнеров в опции, но вы могли бы рассмотреть это.

...