В настоящее время я работаю над проектом, который интенсивно использует дочерние контейнеры 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 вызывается также для типов, которые зарегистрированы в родительском контейнере.
Вероятно, я просто неправильно это использую. Может кто-нибудь, пожалуйста, укажите мне в правильном направлении? Это не должно быть так сложно :)