Расширение Unity Limit - PullRequest
       8

Расширение Unity Limit

0 голосов
/ 23 мая 2019

В настоящее время я работаю над проектом, который интенсивно использует дочерние контейнеры Unity. Вся система управляется событиями, и я хотел бы автоматизировать подписки на события.

Все обработчики событий зарегистрированы в Unity. Итак, что я в основном хочу сделать: всякий раз, когда обработчик события разрешается, автоматически подписывайте его на событие (я). Я придумал расширение для этого, которое, кажется, работает:

internal class MessageSubscriptionUnityExtension : UnityContainerExtension, IBuilderStrategy
{
    private ConcurrentDictionary<IHandleEvents, IDisposable> subscriptions = new ConcurrentDictionary<IHandleEvents, IDisposable>();

    protected override void Initialize()
    {
        this.Context.Strategies.Add(this, UnityBuildStage.PostInitialization);
    }

    public void PreBuildUp(IBuilderContext context)
    {
    }

    public void PostBuildUp(IBuilderContext context)
    {
        if (context.Existing is IHandleEvents eventHandler)
        {
            var eventDistributor = this.Container.Resolve<IDistributeEvents>();
            this.subscriptions.TryAdd(eventHandler, eventDistributor.SubscribeAllEventsHandledBy(eventHandler));
        }
    }

    public void PreTearDown(IBuilderContext context)
    {
    }

    public void PostTearDown(IBuilderContext context)
    {
    }
}

Отписка по-прежнему отсутствует (для этого предназначен словарь).

Но вот проблема: я бы хотел ограничить область действия этого расширения контейнером (дочерним), к которому оно было добавлено.

Пример (псевдокод):

internal class Handler1 : IHandleEvents<SomeEvent>
{
    public void HandleAsync(SomeEvent eventMessage)
    {
        // do something
    }
}

internal class Handler2 : IHandleEvents<SomeEvent>
{
    public void HandleAsync(SomeEvent eventMessage)
    {
        // do something
    }
}


var parent = new UnityContainer();
parent.RegisterType<Handler1>();

var child = parent.CreateChildContainer();
child.AddNewExtension<MessageSubscriptionUnityExtension>();
child.RegisterType<Handler2>();

parent.Resolve<Handler1>(); // Should not subscribe
parent.Resolve<Handler2>(); // Should not work at all
child.Resolve<Handler1>(); // Should not subscribe
child.Resolve<Handler2>(); // Only this should automatically subscribe the event.

Но PostBuildUp вызывается также для типов, которые зарегистрированы в родительском контейнере.

Вероятно, я просто неправильно это использую. Может кто-нибудь, пожалуйста, укажите мне в правильном направлении? Это не должно быть так сложно :)

...