我正在编写一个通用消息处理程序,需要通过 AutoFac 获取各种消息处理程序。消息处理程序的基本定义是:
public interface IMessageHandler<in TMessage> :
IMessageHandler
where TMessage : IMessage
{
Task<IMessageResult> Handle(TMessage message);
}
我还定义了一个标记接口,以便可以在 AutoFac 中轻松注册这些接口
public interface IMessageHandler
{
}
示例消息处理程序是:
public class CreatedEventHandler : IMessageHandler<CreatedEvent>
{
public Task<IMessageResult> Handle(CreatedEvent message)
{
// ...
}
}
这些都是通过 Autofac 很好地注册的,使用
builder.RegisterAssemblyTypes(assemblies)
.Where(t => typeof(IMessageHandler).IsAssignableFrom(t))
.Named<IMessageHandler>(t => t.Name.Replace("Handler", string.Empty))
.InstancePerLifetimeScope();
这一切都很好。但是,当我需要解决处理程序时,我遇到了问题
// handler returned is non null and of type marker interface IMessageHandler
var handler = container.Resolve("CreatedEvent");
// This is null. I just can't understand why
var createdEventHander = handler as IMessageHandler<IMessage>;
为什么上面的转换返回null?即使在IMessageHandler<>
接口中定义了逆变。
如何解决适当的处理程序?
谢谢