IHandles の各ハンドル メソッドが 1 つのイベントを処理する複数のイベントを処理するイベント ハンドラーを基本的に取得するコードがいくつかあります。
public interface IHandles { }
public interface IHandles<T> : IHandles
{
void Handle(T message);
}
public void SubscribeHandler(IHandles eventHandler)
{
var genericHandler = typeof(IHandles<>);
var supportedEventTypes = eventHandler.GetType()
.GetInterfaces()
.Where(iface => iface.IsGenericType && iface.GetGenericTypeDefinition() == genericHandler)
.Select(iface => iface.GetGenericArguments()[0])
.ToList();
// Register this handler for each of the handled types.
foreach (var eventType in supportedEventTypes)
{
Subscribe(eventType.GetType(),
Delegate.CreateDelegate(eventType, eventHandler, "Handle")
);
}
}
これで最初のビットは機能しますが、デリゲートの作成部分が機能するかどうか、およびそれが最善の方法であるかどうかはわかりません。Action を作成することは可能ですか?
Subscribe を取得して Delgate の代わりに IHandles を保存する方が良いかもしれませんが、特に単体テストのために使い捨てアクションを登録できるのは素晴らしいことです。
public IDisposable Subscribe(Type t, Delegate delegate1)
{
var key = t;
if (!actions.ContainsKey(key))
actions.Add(key, new List<Delegate>());
actions[key].Add(delegate1);
return new DomainEventRegistrationRemover(delegate { actions[key].Remove(delegate1); });
}