Синтаксис реестра StructureMap 2.5 - PullRequest
3 голосов
/ 24 сентября 2010

Я пытаюсь настроить альтернативные аргументы конструктора, когда запрошенный тип внедряется в несколько классов.В предыдущих версиях StructureMap это выглядело бы очень похоже на самый первый пример DSL на странице документа , но у меня возникли проблемы с выяснением, как настроить его с новым синтаксисом.

Теперь у меня есть один интерфейс с одной конкретной реализацией, но мне нужно, чтобы аргументы конструктора изменялись в зависимости от объекта, в который он вводится.Например:

interface IInterface{}
class Concrete : IInterface
{
  public Concrete(string param) {}
}
class ConsumerOne
{
  public ConsumerOne(IInterface i) {} // Concrete(param) to be "One"
}
class ConsumerTwo
{
  public ConsumerTwo(IInterface i) {} // Concrete(param) to be "Two"
}

class MyRegistry : Registry
{
  public MyRegistry()
  {
    For<IInterface>()
      .Use<Concrete>
      .Ctor<string>("param")
      .Is(/* "One" if being injected into ConsumerOne,
             "Two" if being injected into ConsumerTwo */);
   }
}

Я думаю, что могу, возможно, сделать это с .AddInstance(x => {}), после For<IInterface>(), но у меня возникают проблемы с поиском, как это сделать.Буду признателен за любую помощь или совет!

1 Ответ

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

Используя именованные экземпляры, вы можете сделать это следующим образом:

For<IInterface>().Use<Concrete>().Named("1")
    .Ctor<string>("param").Is("One");
For<IInterface>().Use<Concrete>().Named("2")
    .Ctor<string>("param").Is("Two");

For<ConsumerOne>().Use<ConsumerOne>()
    .Ctor<IInterface>().Is(x => x.GetInstance<IInterface>("1"));
For<ConsumerTwo>().Use<ConsumerTwo>()
    .Ctor<IInterface>().Is(x => x.GetInstance<IInterface>("2"));

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

...