Есть ли хороший способ использовать события с Unity?
programAction = UnityContainer.Resolve<LoaderDriver>();
(programAction as LoaderDriver).LoadComplete +=
new EventHandler(Program_LoadComplete);
есть ли конфигурация, которая позволяет мне разрешить мои объекты, уже подключенные к событию?
поочередно, есть ли способ, чтобы достичь того же результата? Я заметил, что иногда, когда я не вижу "функции", это потому, что шаблон, о котором я не знаю, предпочтительнее.
2 ответов
Да, есть способ. Вам нужно будет написать расширение, которое добавляет пользовательскую BuilderStrategy на этап Постинициализации Unity BuildPipeline.
код расширения и стратегии должен выглядеть примерно так:
public class SubscriptionExtension : UnityContainerExtension
{
protected override void Initialize()
{
var strategy = new SubscriptionStrategy();
Context.Strategies.Add(strategy, UnityBuildStage.PostInitialization);
}
}
public class SubscriptionStrategy : BuilderStrategy
{
public override void PostBuildUp(IBuilderContext context)
{
if (context.Existing != null)
{
LoaderDriver ld = context.Existing as LoaderDriver;
if(ld != null)
{
ld.LoadComplete += Program_LoadComplete;
}
}
}
}
затем вы добавляете расширение в контейнер
container.AddNewExtension<SubscriptionExtension>();
и когда вы разрешите свой экземпляр LoaderDriver, он автоматически подпишется на EventHandler.
Вы можете найти рабочий пример, который подписывается на классы EventAggregator в TecX. Исходный код находится в TecX.Событие.Единство!-Проект -14-->.
Я написал Брокер событий Unity, который может вам пригодиться. См.этот пост.