2008-11-08 15 views
9

Birden çok arabirimi uygulayan bir sınıfa sahibim. Bu arayüzleri XML ile kaydetmek istiyorum. Tüm bulduğum yeni Fluent Arayüzü için belgelidir. Bu seçenek XML ile destekleniyor mu? Bu özellik eklenirken neler olabilir?Castle-Windsor XML yapılandırması yoluyla ForwardedTypes'i destekliyor

+0

Sadece bildiğiniz gibi, şimdi çerçeve içinde pişiriliyor. –

+0

@Krzysztof: Bu işlevselliğe ihtiyacım var ve tekerleği yeniden icat etmemeyi tercih ediyorum. Ne yazık ki, bu konuda hiçbir şey bulamıyor. Xml yapılandırmasıyla yerleşik tip iletme ile ilgili herhangi bir belge veya bağlantı var mı? –

+0

johny g - şu belgede bulunmaktadır: http://www.castleproject.org/container/documentation/v21/manual/windsorconfigref.html –

cevap

10

[Güncelleştirme] Bu, şu anda Windsor 2.1 veya daha yeni sürümlerde mümkündür. Sözdizimi here belgelerine bakın.


Bu özellik .. itibarıyla XML tercüman uygulanan henüz edilmemiştir ancak bir tesis aracılığı desteği eklemek zor değil devamsızlık diğer özellikler eklemek isteyen zaman (tabii ki bu teknik de yararlıdır mevcut yapılandırma ayrıştırıcısı).

Yani ilk kapalı bir işleyici bir türü için oluşturulduğunda algılar bir tesis ekleyebilir ve bunların mevcut işleyicisi işaret böylece aynı anda iletilmesini hizmetlerden herhangi kaydeder:

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

Şimdi
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"); 
    } 
} 

aslında yapılandırmak için: IDuck ve iDog - ve sonra tabii ki bu örneğin iki ayrı hizmetlerini destekleyen bir mutant ördek/köpek bileşenini geçireceğim, kodda bu faydalanmak gerekir kapsayıcı:

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

Ve şimdi mutlu böyle bir test çalıştırabilirsiniz: Bu yardımcı olur

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

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

    Assert.AreSame(dog, duck); 

Umut.

İlgili konular