2

複数の通知があり、タイプ 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 を変更せずにこれを達成するより良い方法はありませんか?

4

0 に答える 0