一般的なメッセージ ハンドラーを作成しており、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<>
インターフェースで定義されていますが。
適切なハンドラーを解決するにはどうすればよいですか?
ありがとう