Этот вопрос возникает из-за того, что я пытаюсь создать реализацию простого инжектора для MediatR: https://github.com/jbogard/MediatR/pull/14.Посредник и контравариантность с простым инжектором
У меня возникли проблемы при попытке решения реализаций интерфейса общего обработчика. Рассмотрим следующий интерфейс обработчика уведомлений:
public interface INotificationHandler<in TNotification>
where TNotification : INotification
{
void Handle(TNotification notification);
}
INotifcation
просто пустой интерфейс маркера.
я определил следующие обработчики для Pinged
(который реализует INotification
) событие:
public class PingedHandler : INotificationHandler<Pinged>
{
public void Handle(Pinged notification) { }
}
public class PingedHandler2 : INotificationHandler<Pinged>
{
public void Handle(Pinged notification) { }
}
А также общий обработчик (обратите внимание, это должно обрабатывать каждый INotification
):
public class GenericHandler : INotificationHandler<INotification>
{
public void Handle(INotification notification) { }
}
со следующими Регистрация:
var container = new Container();
container.RegisterManyForOpenGeneric(
typeof (INotificationHandler<>),
(service, impls) => container.RegisterAll(service, impls),
AppDomain.CurrentDomain.GetAssemblies());
Теперь я ожидаю:
GetAllInstances<INotificationHandler<Pinged>>();
разрешить как PingedHandler
и PingedHandler2
, которые он делает. Но он не разрешает GenericHandler
, поскольку он реализует INotificationHandler<INotification>
, а не INotificationHandler<Pinged>
. Интересно, есть ли способ позволить Simple Injector искать весь объектный граф и разрешать что-нибудь, то есть Pinged
тоже.
Я нашел a blog post от Стивена о совпадении и противоречивости, но я не могу заставить его работать для моего примера.
'INotificationHandler 'не совместим с' INotificationHandler ', поэтому это не удивительно. Если вы хотите, чтобы все обработчики пытались использовать 'GetAllInstances >'? –
Lee
@Lee 'container.GetAllInstances>()' разрешает только «GenericHandler», что я и ожидаю от него. Я хочу, чтобы «GenericHandler» всегда был разрешен, так как каждое уведомление должно внедрять «INotification». –
@ Ли, но 'INotificationHandler' _is_ совместим с 'INotificationHandler '. –