1

一般的なメッセージ ハンドラーを作成しており、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<>インターフェースで定義されていますが。

適切なハンドラーを解決するにはどうすればよいですか?

ありがとう

4

1 に答える 1