Я хочу разрешить в Виндзор серию классов, реализующих этот интерфейс:
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>());
Есть предложения?
EDIT:
Хорошо, похоже, проблема заключалась в следующем: у меня был зависимый компонент, зарегистрированный как запускаемый (через StartableFacility), который был вызван до регистрации моего анализатора.
class DependentObject
{
public DependentObject(IDocumentParser firstParser) {}
public void Start() {}
public void Stop() {}
}
Теперь похоже, что запускаемый компонент запускается сразу после регистрации, тем самым останавливая процесс разрешения для всех зависимых парсеров. Для моего случая я решил, настроив StartableFacility с DeferredStart (), например:
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>()
);
Мне интересно, однако, почему это происходит. В таких случаях я ожидаю, что Виндзор либо выдаст исключение, заявив, что он не может решить зависимость IDocumentParser, либо решит всю цепочку, а не только первый узел. Кто-нибудь знает, если это по замыслу?