Структура карты - несколько реализаций интерфейса - PullRequest
8 голосов
/ 23 июня 2011

Я совершенно новичок в Structuremap и не понимаю, как подключить интерфейс, имеющий несколько реализаций.

Допустим, у меня есть Controller1 и Controller2. У меня есть Interface1, который реализуется двумя отдельными классами, Class1ForInterface1 и Class2ForInterface1. В Controller1 я хочу Class1ForInterFace1 впрыскивать и в Controller2 я хочу Class2ForInterface1 впрыскивать.

Как мне связать это с Structuremap? Кажется, у меня может быть только одно отображение интерфейса для конкретного типа?

Спасибо!

1 Ответ

10 голосов
/ 24 июня 2011

Можно иметь несколько классов, реализующих один и тот же интерфейс со структурной картой.

Если вы называете свои сопоставления, вы можете получить их с таким именем позже.

For<MyInterface>().Add<Class1ForMyInterface>().Named("Class1");
For<MyInterface>().Add<Class2ForMyInterface>().Named("Class2");

Если вам нужен ваш Class1ForMyInterface, тогда вы можете позвонить

container.GetInstance<MyInterface>("Class1");

Есть также несколько способов отобразить все это в вашем контейнере, а также

For<IController>().Add<Controller1>().Ctor<MyInterface>().Is(i => i.GetInstance<MyInterface>("Class1"));

Или, если вы сохраняете smartinsatance, который возвращается при регистрации типа, вы можете использовать его в сопоставлении.

var class1 = For<MyInterface>().Add<Class1ForMyInterface>().Named("Class1");
For<IController>().Add<Controller1>().Ctor<MyInterface>().Is(class1);
...