Есть ли хороший способ использовать события с 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, который может вам пригодиться. См.этот пост.