2011-07-29 16 views
7

Trong Caliburn.Micro tài liệu các tác giả đề cập đến khả năng như vậy:Caliburn.Micro. Tự động gọi eventaggregator.Subscribe() cho implementors IHandle với Autofac

documentation link

IHandle thừa hưởng từ một giao diện đánh dấu IHandle. Điều này cho phép sử dụng phép đúc để xác định xem một cá thể đối tượng có đăng ký bất kỳ sự kiện nào không. Điều này cho phép tự động đăng ký đơn giản nếu bạn tích hợp với một thùng chứa IoC. Hầu hết các container IoC (bao gồm cả SimpleContainer) cung cấp một hook để được gọi khi một cá thể mới được tạo ra. Chỉ cần dây để gọi lại vùng chứa của bạn, kiểm tra cá thể đang được tạo để xem nó có triển khai IHandle hay không và nếu có, hãy gọi Đăng ký trên trình tổng hợp sự kiện.

Làm cách nào để đạt được điều này với Autofac?

Tôi đã cố gắng sử dụng các tính năng của trang trí, nhưng tất nhiên nó không phù hợp với trường hợp này. Hơn nữa, theo mặc định, người triển khai của tôi là IHandle <> sẽ không được đăng ký là trường hợp của IHandle trong vùng chứa.

P.S. Cung cấp không đúng cách thực hiện này trong trường hợp nó có thể là bất kỳ việc sử dụng nào, mặc dù tôi nghi ngờ.

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

Trả lời

13

Làm một vài giả thuyết về cách Caliburn làm việc, tôi nghĩ rằng những gì bạn đang tìm kiếm là:

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

Trường hợp mô-đun được thực hiện một cái gì đó như:

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, lại bị đánh đập ở vạch đích! :) –

+0

Nó thực sự đáp ứng nhu cầu hiện tại của tôi. Cảm ơn! – Alec

0

Đây là một bài cũ, nhưng tôi nghĩ tôi sẽ thêm một ghi chú vào nó.

Bạn có thể sử dụng các nhà xây dựng trong Autofac để bơm xử lý:

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

Trong khi ở trên không phải là lớp cơ sở EventAggregator từ Caliburn.Micro, bạn có thể sub-class nó, hoặc thay đổi mã nguồn để cung cấp hàm tạo riêng cho EventAggregator.

Các vấn đề liên quan