2011-12-16 7 views
6
programAction = UnityContainer.Resolve<LoaderDriver>(); 
(programAction as LoaderDriver).LoadComplete += 
    new EventHandler(Program_LoadComplete); 

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

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

ответ

4

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

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

Смежные вопросы