Инъекция свойств того же типа в Виндзор - PullRequest
2 голосов
/ 26 апреля 2011

Я хочу разрешить в Виндзор серию классов, реализующих этот интерфейс:

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, либо решит всю цепочку, а не только первый узел. Кто-нибудь знает, если это по замыслу?

1 Ответ

1 голос
/ 27 апреля 2011

Это сделано специально - Windsor по умолчанию рассматривает зависимости свойств как необязательные, поэтому при запросе он делает все возможное, чтобы удовлетворить его, но если не может, то просто не делает.

Если вы хотите, чтобы эти зависимости были удовлетворены, либо сделайте их обязательными, либо используйте переопределения служб для их явного указания

...