首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Castle-Windsor是否通过XML配置支持ForwardedTypes

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

Stack Overflow用户
提问于 2008-11-08 02:12:42
回答 1查看 1.3K关注 0票数 9

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2008-11-08 03:26:49

更新现在可以在Windsor 2.1或更高版本中执行此操作。有关语法here,请参阅文档。

到目前为止,此功能尚未在XML解释器中实现。但是,通过工具添加对它的支持并不困难(显然,当想要添加现有配置解析器中缺少的其他特性时,这种技术也很有用)。

因此,首先我们添加一个工具,它将检测何时为某个类型创建了处理程序,同时将注册任何转发的服务,以便它们指向现有的处理程序:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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");
  }
}

现在来实际配置容器:

代码语言:javascript
复制
 <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>

现在我们可以很高兴地执行这样的测试:

代码语言:javascript
复制
  WindsorContainer container = new WindsorContainer(new XmlInterpreter());

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

  Assert.AreSame(dog, duck);

希望这能有所帮助。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/274220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档