在温莎注入相同类型的属性

时间:2011-04-26 14:04:40

标签: c# castle-windsor

我想在Windsor中解决一系列实现此接口的类:

public interface IDocumentParser
{
    Message ParseDocument(XDocument document);
    IDocumentParser NextParser { get; set; }
}

基本上我所拥有的是一个责任链,其中第一个解析器如果无法处理文档则委托给链中的下一个解析器。我想知道温莎是否有办法解决这种依赖性。我尝试了以下操作,但它将我的NextParser属性设置为null。

  container.Register(
    Component.For<IDocumentParser>().ImplementedBy<DocumentParser1>(),
    Component.For<IDocumentParser>().ImplementedBy<DocumentParser2>(),
    Component.For<IDocumentParser>().ImplementedBy<DocumentParser3>(),
    Component.For<IDocumentParser>().ImplementedBy<DocumentParser4>());

有什么建议吗?

修改

好吧,看起来问题如下:我有一个注册为可启动的依赖组件(通过StartableFacility),在我的解析器注册之前调用它。

class DependentObject
{
    public DependentObject(IDocumentParser firstParser) {}
    public void Start() {}
    public void Stop() {}
}

现在,它看起来像一个可启动组件一旦注册就会启动,从而以某种方式停止所有依赖解析器的解析过程。对于我的情况,我通过使用DeferredStart()配置StartableFacility来解决,如下所示:

var container = new WindsorContainer();
  container
    .AddFacility<StartableFacility>(
       // Without this container.Resolve<IDocumentParser>().NextParser is null
       c => c.DeferredStart()); 
    .Register(
      Component.For<DependentObject>()
      .StartUsingMethod(m => m.Start)
      .StopUsingMethod(m => m.Stop),
      Component.For<IDocumentParser>().ImplementedBy<DocumentParser1>(),
      Component.For<IDocumentParser>().ImplementedBy<DocumentParser2>(),
      Component.For<IDocumentParser>().ImplementedBy<DocumentParser3>(),
      Component.For<IDocumentParser>().ImplementedBy<DocumentParser4>()
    );
但是,我想知道为什么会这样。在这种情况下,我希望Windsor要么抛出异常,说明他无法解决IDocumentParser依赖关系,或解决整个链,而不仅仅是第一个节点。有谁知道这是否是设计的?

1 个答案:

答案 0 :(得分:1)

这是设计的 - Windsor默认将属性依赖关系视为可选属性,因此当请求一个属性时,它会尽力满足它,但如果它不能,则它不会。

如果要强制满足这些依赖关系要么强制要求它们,要么使用服务覆盖来明确指定它们