StructureMap: как настроить конкретный конкретный экземпляр интерфейса для использования определенного CTOR

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 использовал конструктор «новый Foo2 (1)», который я пробовал

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

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


person E Rolnicki    schedule 30.11.2011    source источник


Ответы (1)


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

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
person Cristian Lupascu    schedule 13.02.2012