1

Я разместил an issue на SM repo.can StructureMap auto-register Handler <T> для IHandler <T>?

Мой вопрос похож на this one, но я бы хотел локализовать проблему.

Предположим, у меня есть общий интерфейс IPrinter<T> и его общая реализация Printer<T>. Я хотел бы, чтобы StructureMap разрешил конкретный закрытый тип Printer<string>, когда я сделаю container.GetInstance<IPrinter<string>>.

Явная регистрация работает нормально здесь:

container.Configure(r => r.For(typeof (IPrinter<>)).Use(typeof (Printer<>)));

Но материал сканирования не удается: RegisterConcreteTypesAgainstTheFirstInterface() результаты 202 No Default Instance defined StructureMap за исключением, когда я пытаюсь решить IPrinter<string>.

Есть ли способ выполнить поведение, которое я хочу, без явной настройки?

ответ

1

ConnectImplementationsToTypeClosing() работает отлично, но вы должны знать, как это работает. Он регистрирует типы с помощью метода Add(), который отличается по своему поведению, чем регистрации, выполненные с использованием метода Use(). Подробное объяснение можно найти here. Короче, если вы получите код ошибки 202, который не означает, что вы не зарегистрировали какие-либо конкретные типы для запрошенного типа плагина. Это может быть так, что вы зарегистрировали их более одного, и не указан экземпляр по умолчанию.

Надеюсь, это поможет.

EDIT

К этому: «Это может быть случай, когда вы зарегистрировали их больше, чем один и экземпляр по умолчанию не указано» я имел в виду, что более одной реализации одного и того же типа плагин был зарегистрирован, например для

IPrinter<string> 

вы определили:

StringPrinter1 : IPrinter<string> and StringPrinter2 : IPrinter<string> 

Не то, что вы разрешили зарегистрировать только один тип для IPrinter <>.

Если вы хотите зарегистрировать несколько реализаций того же типа общего плагина, например,

IPrinter<string> 

то я советую использовать:

var container = new Container(c => c.Scan(s => s.AddAllTypesOf(typeof(IHandler<>)).NameBy(t => t.Name))); 

иметь именованные регистрацию, а затем разрешить их по имени явно:

var stringPrinter1 = container.GetInstance<IPrinter<string>>("StringPrinter1"); 

или с помощью такой регистрации:

c.For<IMyTypeUsingPrinter>().Use<MyTypeUsingPrinter>().Ctor<IPrinter<string>>().Named("StringPrinter1"); 

MyTypeUsingPrinter бы ввел StringPrinter1 в качестве переменной IPrinter < string>.

+0

Спасибо! Проверьте обновление, я сделал его более понятным. '.For (typeof (IPrinter <>)). Используется (typeof (Printer <>)'), но то, что я ищу, действительно автоматический способ регистрации простых случаев. И я думаю, что это просто, если это только одна (общая) реализация общего интерфейса. – vorou

+0

@ vorou ​​- я отредактировал свой ответ, посмотрите. – LetMeCodeThis

+0

Я знаю о явных способах этого сделать. То, что я ищу, - это * автоматический * один, под которым я хочу написать только строку 'RegisterConcreteTypesAgainstTheFirstInterface()'. Я не хочу перечислять все общие типы, которые у меня есть, в моем приложении, чтобы они их зарегистрировали. – vorou

 Смежные вопросы

  • Нет связанных вопросов^_^