当前位置:  开发笔记 > 运维 > 正文

Castle-Windsor是否通过XML配置支持ForwardedTypes

如何解决《Castle-Windsor是否通过XML配置支持ForwardedTypes》经验,为你挑选了1个好方法。

我有一个实现多个接口的类.我想通过XML注册这些接口.我找到的只是新Fluent界面的文档.这个选项是否通过XML支持?添加此功能会涉及什么?



1> Bittercoder..:

[ 更新 ]现在可以在Windsor 2.1或更新版本中使用.见语法的文档在这里.


此功能尚未在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");
  }
}

现在实际配置容器:

 
  
    
  
  
    
      
        Example.IDuck, Example
      
    
  

现在我们可以愉快地执行这样的测试:

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

  var dog = container.Resolve();
  var duck = container.Resolve();

  Assert.AreSame(dog, duck);

希望这可以帮助.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有