StructureMap: как настроить конкретный конкретный экземпляр интерфейса для использования определенного CTOR - PullRequest
4 голосов
/ 30 ноября 2011
public interface IFoo{}
public class Foo1 : IFoo {
  public Foo1(int id){}
  public Foo1(string val){}
}

public class Foo2 : IFoo {
  public Foo2(int id){}
  public Foo2(string val){}
}

Соответствующие параметры реестра для этого ...

ForRequestedType<IFoo>().TheDefault.Is.ConstructedBy(()=>new Foo1("some string val"));
InstanceOf<IFoo>().Is.OfConcreteType<Foo2>();

затем мы используем IFoo в качестве параметра для чего-то еще ... например:

public interface IBar{}
public class Bar1:IBar {
  public Bar1(IFoo foo){}
}

public class Bar2:IBar {
  public Bar2(IFoo foo){}
}

Регистрация для этого выглядит следующим образом ...

ForRequestedType<IBar>().TheDefault.Is.OfConcreteType<Bar1>().CtorDependency<IFoo>().Is<Foo1>();

Теперь я хочу, чтобы Bar2 использовал Foo2, и я хочу, чтобы Foo2 использовал конструктор "new Foo2 (1)", который я пробовал

InstanceOf<Foo2>().Is.ConstructedBy(()=> new Foo2(1));

но это не удалось. Как, если вообще, я могу заставить это работать с использованием реестра StructureMap?

1 Ответ

2 голосов
/ 14 февраля 2012

Вы можете сделать это в своем реестре:

For<IFoo>().Use(() => new Foo2(1)).Named("BarFoo");
For<IFoo>().Use(() => new Foo1("some string val"));

For<IBar>().Use<Bar1>().Ctor<IFoo>().Named("BarFoo");

Я проверил результат следующим образом:

// this will be a Foo1 instance constructed with a string ctor parameter
var foo = container.GetInstance<IFoo>(); 

// this will be a Bar1, containing an instance of Foo2, constructed with the int ctor parameter
var bar = container.GetInstance<IBar>();

Небольшое объяснение строк конфигурации:

  • строка 1 - регистрация IFoo, которая привязывается к Foo2 (int) - с именем "BarFoo"
  • строка 2 - регистрация IFoo, которая привязывается к Foo1 (строка) - это будет по умолчанию для IFoo, поскольку она определена последней
  • строка 3 - регистрация IBar, которая связывается с Bar1, говоря ему использовать привязку с именем "BarFoo" для решения зависимости IFoo
...