这个问题源于我正在尝试为 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
。
我发现了 Steven 的一篇关于协方差和逆变的博客文章,但我无法让它适用于我的示例。