我想在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依赖关系,或解决整个链,而不仅仅是第一个节点。有谁知道这是否是设计的?
答案 0 :(得分:1)
这是设计的 - Windsor默认将属性依赖关系视为可选属性,因此当请求一个属性时,它会尽力满足它,但如果它不能,则它不会。
如果要强制满足这些依赖关系要么强制要求它们,要么使用服务覆盖来明确指定它们