2011-07-29 9 views
7

ile IHandle implementors eventaggregator.Subscribe() çağrısı:Caliburn.Micro. Otomatik olarak yazarlar böyle bir olasılık söz <strong>Caliburn.Micro</strong> belgelerinde AutoFac

documentation link

IHandle bir işaretleyici arayüzünden IHandle devralır. Bu, bir nesne örneğinin herhangi bir etkinliğe abone olup olmadığını belirlemek için döküm kullanımı sağlar. Bu, bir IoC konteynerine entegre ederseniz, basit otomatik abone olmanızı sağlar. En IoC kapsayıcılar (SimpleContainer dahil), yeni bir örnek oluşturulduğunda çağrılmak üzere bir kanca sağlar. Kapsayıcınızın geri araması için kablo yapıp, IHandle'ı uygulayıp uygulamadığını görmek için yaratılan örneği inceleyin ve eğer varsa, olay toplayıcıya abone olun.

Bunu Autofac ile nasıl başarmak mümkündür?

dekoratör'un özelliklerini kullanmayı denedim, ancak tabi ki bu durum için uygun olmayan bir yöntem. Daha fazla, varsayılan olarak IHandle <> uygulamacılarım, kapsayıcıda IHandle örnekleri olarak kaydedilmiyor.

P.S. Bu hatalı uygulama, herhangi bir kullanım olabilir şüphesiz olsa da.

builder.RegisterInstance<IEventAggregator>(new EventAggregator()); 
builder.RegisterDecorator<IHandle>((container, handler) => 
{ 
    var eventAggregator = container.Resolve<IEventAggregator>(); 
    eventAggregator.Subscribe(handler); 
    return handler; 
}, "unsubscribed", "subscribed"); 

cevap

13

Caliburn nasıl çalıştığı hakkında birkaç varsayımlar yapma, sana aradığınızı düşünüyorum:

class AutoSubscribeHandersModule : Module 
{ 
    protected override AttachToComponentRegistration(
     IComponentRegistry registry, 
     IComponentRegistration registration) 
    { 
     if (typeof(IHandle).IsAssignableFrom(registration.Activator.LimitType)) 
     { 
      registration.Activated += (sender, e) => { 
       var aggregator = e.Context.Resolve<IEventAggregator>(); 
       aggregator.Subscribe((IHandle)e.Instance); 
      }; 
     } 
    } 
} 
+0

Doh, yine bitiş çizgisinde dayak! :) –

+0

Mevcut gereksinimlerimi gerçekten tatmin ediyor. Teşekkürler! – Alec

0

budur: modül gibi bir şey uygulanmaktadır

builder.RegisterType<MyViewModel>(); 
builder.RegisterModule<AutoSubscribeHandlersModule>(); 

eski bir yazı, ama sadece bir not ekleyeceğimi düşündüm.

Sen işleyicileri enjekte etmek AutoFac içinde yapıcısını kullanabilirsiniz: Yukarıdaki Caliburn.Micro dan EventAggregator taban sınıfı, sen alt sınıf bunu can veya kaynak kodunu değiştirmek olmasa da

public MessageDispatcher(IEnumerable<IHandler> handlers) 
{ 
    foreach (var handler in handlers) 
     Subscribe(handler); 
} 

EventAggregator için kendi kurucunuzu sağlayın.

İlgili konular