2010-05-01 33 views
5

Cho phép xem xét một số trường hợp:Trong Castle Windsor, tôi có thể đăng ký thành phần Giao diện và nhận ủy quyền thực hiện không?

_windsor.Register(Component.For<IProductServices>().ImplementedBy<ProductServices>().Interceptors(typeof(SomeInterceptorType)); 

Trong trường hợp này, khi tôi yêu cầu một IProductServices windsor sẽ ủy quyền giao diện để đánh chặn các cuộc gọi phương thức giao diện. Nếu thay vào đó tôi làm điều này:

_windsor.Register(Component.For<ProductServices>().Interceptors(typeof(SomeInterceptorType)); 

sau đó tôi không thể yêu cầu windsor để giải quyết IProductServices, thay vào đó tôi xin ProductServices và nó sẽ trở lại một lớp con năng động mà sẽ ngăn chặn các cuộc gọi phương thức ảo. Tất nhiên, lớp con động vẫn triển khai 'IProductServices'

Câu hỏi của tôi là: Tôi có thể đăng ký thành phần Giao diện như trường hợp đầu tiên và nhận proxy lớp con như trong trường hợp thứ hai không ?.

Có hai lý do khiến tôi muốn điều này:
1 - Do mã sẽ giải quyết không thể biết về lớp ProductServices, chỉ về giao diện IProductServices. 2 - Vì một số lời gọi sự kiện truyền người gửi dưới dạng tham số, sẽ chuyển đối tượng ProductServices và trong trường hợp đầu tiên đối tượng này là trường trên proxy động, không phải đối tượng thực được trả về bởi windsor. Hãy để tôi đưa ra một ví dụ về cách này có thể làm phức tạp điều: Cho phép nói rằng tôi có một bộ sưu tập tùy chỉnh mà làm điều gì đó khi các mặt hàng của họ thông báo cho một sự thay đổi sở hữu:

private void ItemChanged(object sender, PropertyChangedEventArgs e) 
    { 
     int senderIndex = IndexOf(sender); 
     SomeActionOnItemIndex(senderIndex); 
    } 

Mã này sẽ thất bại nếu tôi thêm một proxy giao diện, bởi vì người gửi sẽ là trường trong proxy giao diện và IndexOf (người gửi) sẽ trả về -1.

Trả lời

5

Vâng, bạn có thể:

_windsor.Register(Component.For<ProductServices, IProductServices>() 
    .Interceptors(typeof(SomeInterceptorType)); 
+1

Làm việc rất tốt, cảm ơn. –

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