2008-11-08 52 views
9

我有一個實現多個接口的類。 我想通過XML註冊這些接口。 我找到的全部是新Fluent界面的文檔。 該選項是否支持通過XML? 添加此功能會涉及什麼?Castle-Windsor是否通過XML配置支持ForwardedTypes

+0

就這麼你知道,它現在被烘焙到框架中。 – 2009-12-15 22:19:59

回答

10

[更新]這現在可以在Windsor 2.1或更新的版本中使用。請參閱文檔以獲取語法here


此功能尚未在XML解釋器實現的又..但它是不是很難通過工具來添加對它的支持(顯然想添加從不存在其他功能時這種技術也是有用現有的配置解析器)。

所以第一關,我們添加設備的類型創建處理程序時,將檢測到,所以他們指向現有的處理程序,同時將註冊任何轉發服務:

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); 
    } 
    } 
} 

然後,當然,我們需要在代碼中使用的這個,在這個例子中我將有一個支持兩個獨立的服務突變鴨/狗成分 - IDuck和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"); 
    } 
} 

我們實際配置容器:

<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> 

現在我們可以愉快地執行這樣的測試:

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

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

    Assert.AreSame(dog, duck); 

希望這有助於。