2008-11-08 26 views
9

Tôi có một lớp thực hiện nhiều giao diện. Tôi muốn đăng ký các giao diện này thông qua XML. Tất cả những gì tôi tìm thấy là tài liệu cho Giao diện thông thạo mới. Tùy chọn này có được hỗ trợ qua XML không? Điều gì sẽ liên quan đến việc thêm tính năng này?Hỗ trợ Castle-Windsor ForwardedTypes qua cấu hình XML

+0

Chỉ cần bạn biết, hiện tại nó đã được đưa vào khuôn khổ. –

+0

@Krzysztof: Tôi yêu cầu chức năng này và không muốn phát minh lại bánh xe. Thật không may, không thể tìm thấy bất cứ điều gì về điều này. Bất kỳ tài liệu hoặc liên kết nào liên quan đến việc chuyển tiếp kiểu dựng sẵn thông qua cấu hình Xml? –

+0

johny g - nó có trong tài liệu: http://www.castleproject.org/container/documentation/v21/manual/windsorconfigref.html –

Trả lời

10

[Cập nhật] Điều này hiện có thể có trong Windsor 2.1 trở lên. Xem tài liệu về cú pháp here.


Tính năng này chưa được thực hiện trong các phiên dịch XML như được nêu ra .. Tuy nhiên nó không phải là khó khăn để hỗ trợ thêm cho nó thông qua một cơ sở (rõ ràng là kỹ thuật này cũng rất hữu ích khi muốn thêm các tính năng khác vắng mặt trình phân tích cú pháp cấu hình hiện có).

Vì vậy, trước hết chúng ta thêm một cơ sở đó sẽ phát hiện khi một handler được tạo ra cho một loại, và đồng thời sẽ đăng ký bất kỳ dịch vụ chuyển tiếp để họ trỏ đến xử lý hiện có:

public class HandlerForwardingFacility : AbstractFacility 
{ 
    IConversionManager conversionManager; 

    protected override void Init() 
    { 
    conversionManager = (IConversionManager)Kernel.GetSubSystem(SubSystemConstants.ConversionManagerKey); 
    Kernel.HandlerRegistered += new HandlerDelegate(Kernel_HandlerRegistered);  
    } 

    void Kernel_HandlerRegistered(IHandler handler, ref bool stateChanged) 
    { 
    if (handler is ForwardingHandler) return; 

    var model = handler.ComponentModel; 

    if (model.Configuration == null) return; 

    var forward = model.Configuration.Children["forward"]; 
    if (forward == null) return; 

    foreach (var service in forward.Children) 
    { 
     Type forwardedType = (Type)conversionManager.PerformConversion(service, typeof (Type)); 
     Kernel.RegisterHandlerForwarding(forwardedType, model.Name); 
    } 
    } 
} 

và sau đó dĩ nhiên chúng ta cần phải tận dụng điều này trong mã, ví dụ này tôi sẽ có một thành phần vịt/con chó đột biến có hỗ trợ hai dịch vụ riêng biệt - IDuck và IDog:

public interface IDog 
{ 
    void Bark(); 
} 

public interface IDuck 
{ 
    void Quack(); 
} 

public class Mutant : IDog, IDuck 
{ 
    public void Bark() 
    { 
    Console.WriteLine("Bark"); 
    } 

    public void Quack() 
    { 
    Console.WriteLine("Quack"); 
    } 
} 

Bây giờ để thực sự cấu hình vùng chứa:

<castle> 
    <facilities> 
    <facility id="facility.handlerForwarding" type="Example.Facilities.HandlerForwardingFacility, Example" /> 
    </facilities> 
    <components> 
    <component id="mutant" service="Example.IDog, Example" type="Example.Mutant, Example"> 
     <forward> 
     <service>Example.IDuck, Example</service> 
     </forward> 
    </component> 
    </components> 
</castle> 

Và bây giờ chúng ta hạnh phúc có thể thực hiện một thử nghiệm như thế này:

WindsorContainer container = new WindsorContainer(new XmlInterpreter()); 

    var dog = container.Resolve<IDog>(); 
    var duck = container.Resolve<IDuck>(); 

    Assert.AreSame(dog, duck); 

Hope this helps.

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