Может ли StructureMap автоматически регистрировать обработчик<T> для IHandler<T>?

Я опубликовал вопрос о SM репо.

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

Допустим, у меня есть общий интерфейс 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(). Подробное объяснение можно найти здесь. Короче говоря, когда вы получаете код ошибки 202, это не означает, что вы не зарегистрировали никаких конкретных типов для запрошенного типа плагина. Это может быть случай, когда вы зарегистрировали их более одного, и экземпляр по умолчанию не указан.

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

РЕДАКТИРОВАТЬ

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

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.

Другие вопросы по тегам