2009-01-07 18 views
5

Nếu tôi đã đăng ký một số thành phần với Windsor.Làm cách nào để yêu cầu Windsor thêm một Thiết bị chặn cho tất cả các thành phần đã đăng ký thực hiện IMustBeIntercepted

IAnimal cung cấp BigAnimal IPerson cung cấp SmellyPerson IWhale cung cấp BlueWhale

vv .. khá tiêu chuẩn thành phần Registeration

tất cả các loại trên thực hiện IMustBeIntercepted, làm thế nào để tôi nói với container thêm một đánh chặn cho tất cả các loại mà triển khai thực hiện IMustBeImplemented để khi Resolve được gọi là nó được trả về một BigAnimal với một interceptor như được định nghĩa vì nó khớp với nhau. Tôi biết tôi có thể làm điều này cho mỗi người nhưng thêm nó cấu hình XML hoặc cấu hình programatic mà tôi muốn tránh

Trả lời

5

Đơn giản chỉ cần tạo ra một giao diện như thế này:

public interface IMustBeIntercepted {} 

và một cơ sở như thế này:

public class InterceptionFacility : AbstractFacility { 
    protected override void Init() { 
     Kernel.ComponentRegistered += new Castle.MicroKernel.ComponentDataDelegate(Kernel_ComponentRegistered); 
    } 

    void Kernel_ComponentRegistered(string key, Castle.MicroKernel.IHandler handler) { 
     if(typeof(IMustBeIntercepted).IsAssignableFrom(handler.ComponentModel.Implementation)) { 
      handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(TestInterceptor))); 
     } 
    } 
} 

Sau đó đăng ký cơ sở với vùng chứa bằng cách sử dụng thẻ <facility>. Bây giờ tất cả các thành phần thực hiện IMustBeIntercepted sẽ bị chặn bởi máy đánh chặn TestInterceptor.

+0

Nó hoạt động! Và .. nó đã cứu tôi! – dtroy

2

Chỉ cần viết bé này:

public static BasedOnDescriptor WithInterceptor(this BasedOnDescriptor reg, string interceptorComponentName) { 
     return reg.Configure(x=> x.Configuration(
       Child.ForName("interceptors").Eq(
        Child.ForName("interceptor").Eq(
         "${" + interceptorComponentName + "}" 
       )))); 
    } 
Các vấn đề liên quan