この質問は、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のブログ投稿を見つけましたが、私の例ではうまくいきません。