Есть ли хороший способ использовать события с Unity? - PullRequest
6 голосов
/ 17 декабря 2011
programAction = UnityContainer.Resolve<LoaderDriver>();
(programAction as LoaderDriver).LoadComplete +=
    new EventHandler(Program_LoadComplete);

Существует ли конфигурация, позволяющая мне разрешить мои объекты, уже подключенные к событию?

Альтернативно, есть ли предпочтительный способ достижения того же результата? Я заметил, что иногда, когда я не вижу «особенность», потому что предпочтителен шаблон, о котором я не знаю.

Ответы [ 2 ]

4 голосов
/ 17 декабря 2011

Да, есть способ.Вам нужно написать расширение, которое добавляет пользовательскую BuilderStrategy к этапу PostInitialization в 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.Event.Unity .

0 голосов
/ 17 декабря 2011

Я написал брокер событий Unity, который вам может пригодиться.Смотрите этот пост .

...