複数の通知があり、タイプ IBusEvent のすべての通知に対して 1 つのハンドラー インスタンスのみが必要です。
これが私の現在の状況です
通知
public interface IBusEvent : IAsyncNotification
{
}
public class RecEnded : IBusEvent
{
public long RecId { get; set; }
public RecEnded(long recId)
{
RecId = recId;
}
}
public class RecStarted : IBusEvent
{
public long RecId { get; set; }
public int InitiatorCellId { get; set; }
public RecStarted(long recId, int initiatorCellId)
{
RecId = recId;
InitiatorCellId = initiatorCellId;
}
}
ハンドラー
これらの通知の両方に対してハンドラーは 1 つしかありません。
public class BusEventHandler : IAsyncNotificationHandler<IBusEvent>, IDisposable
{
private IBusConfig _config;
public BusEventHandler(IBusConfig config)
{
_config = config;
// connect to the bus
}
public async Task Handle(IBusEvent notification)
{
// send package to the bus
}
public void Dispose()
{
// close & dispose connection
}
IOC
public class MediatorRegistry : Registry
{
public MediatorRegistry()
{
For<SingleInstanceFactory>().Use<SingleInstanceFactory>(ctx => t => ctx.GetInstance(t));
For<MultiInstanceFactory>().Use<MultiInstanceFactory>(ctx => t => ctx.GetAllInstances(t));
For<IMediator>().Use<Mediator>();
}
}
public class HandlersRegistry : Registry
{
public HandlersRegistry()
{
// I have multiple configs for IBusConfig.
// get the configuration from the config file
List<IBusConfig> configs = AppSettings.GetBusConfigs();
foreach (IBusConfig config in configs)
For(typeof(IAsyncNotificationHandler<IBusEvent>))
.Singleton()
.Add(i => new BusEventHandler(config));
}
}
必要なもの
この IOC レジストリを使用すると、IBusConfig ごとに BusEventHandler の 2 つのインスタンスを受け取ります。
IBusConfig ごとに BusEventHandler のインスタンスを 1 つだけ持つ必要があります。
良い動作を実現できる唯一の方法は、MediatorRegistry を変更することです
public class MediatorRegisty : Registry
{
public MediatorRegisty()
{
For<SingleInstanceFactory>().Use<SingleInstanceFactory>(ctx => t => ctx.GetInstance(t));
For<MultiInstanceFactory>().Use<MultiInstanceFactory>(ctx => t => TryGetAllInstances(ctx, t));
For<IMediator>().Use<Mediator>();
}
private static IEnumerable<object> TryGetAllInstances(IContext ctx, Type t)
{
if (t.GenericTypeArguments[0].GetInterfaces().Contains(typeof(IBusEvent)))
return ctx.GetAllInstances(typeof(IAsyncNotificationHandler<IBusEvent>));
else
return ctx.GetAllInstances(t);
}
}
MediatorRegistry を変更せずにこれを達成するより良い方法はありませんか?