Виндзорский Сеттер Инъекция в коде - PullRequest
3 голосов
/ 16 ноября 2010

Я использую Windsor для выполнения IoC в нашем .Net-проекте, но у меня возникают трудности с внедрением сеттера в код.

Я полагаю, что это происходит из-за того, что я полностью регистрирую свои компоненты, поскольку в конечном итоге я надеюсь, что унаследованный проект будет полностью совместим с IoC и в основном модульным тестированием (сладких снов!)

Вот как я регистрирую DAO:

container
    .Register(AllTypes.FromAssemblyNamed("MyApp.Business")
    .Where(Component.IsInNamespace("MyApp.Business.Dao"))
    .WithService.DefaultInterface());

А вот как я регистрирую компоненты с использованием DAO:

container
    .Register(AllTypes.FromAssemblyNamed("MyApp.Business")
    .Where(Component.IsInNamespace("MyApp.MyComponentObject")));

Я былнадеясь, что сеттеры будут автоматически выбраны в компонентах, но ресурсы, которые я обнаружил, похоже, показывают, что сеттеры должны быть определены.

К сожалению, я нашел только примеры того, как это сделать в конфигурационном XML, не в коде.

Я нашел, как добавить параметр к компоненту в коде, но, похоже, существуют ограничения.Похоже, что это должна быть строка, и даже если это не так, похоже, что это заставит меня объявить эти компоненты один за другим вместо простой регистрации.Этот код стал бы огромным, если бы мне пришлось сделать это, и Виндзор каким-то образом потерял бы свою привлекательность для меня.

Я помню, что использование Spring состояло в том, если бы бин был объявлен, автоматическая разводка внедрила бы его без каких-либо проблем.

Я что-то упускаю здесь с Виндзором?

===============

Дополнительная информация:

ВКласс компонента, который будет использовать компонент Dao, вот как я объявляю метод установки:

private IMyDao dao = null;

public IMyDao Dao
{
  set { this.dao = value;  }
}

Основная причина, по которой я хочу использовать метод установки, заключается в том, что я не могу изменить конструкторы, не оказав достаточного влияния на наследиеapp.

===============

Обновление:

Закомментировали большую часть моего регистрационного кода, оставив только этопосмотрим, работает ли это в простом сценарии, но это не так:

//DAOs
container.Register(

Component.For<IMyDao>()
  .ImplementedBy<MyDao>()
    .Named("myDao"),

//Components
Component.For<MyComponentObject>()
  .Parameters(Parameter.ForKey("Dao").Eq("myDao")));

Я установил точку останова, когда код подвергается бомбардировке, а также set свойства и зависимость DAO по-прежнему null в моем компоненте и set строка свойства фактически никогда не вызывается.

1 Ответ

0 голосов
/ 11 октября 2013

Инъекционный метод Castle Windsor просто работает правильно.

[TestClass]
public class SetterInjectionTest
{
    [TestMethod]
    public void TestMethod1()
    {
        var container = new WindsorContainer();
        container.Register(Component.For<IServiceB>().ImplementedBy<ServiceB>());
        container.Register(Component.For<IServiceA>().ImplementedBy<ServiceA>());
        var serviceA = container.Resolve<IServiceA>();

        Assert.IsTrue(serviceA.IsPropertyInjected());
    }
}

public class ServiceA : IServiceA
{
    public IServiceB B { get; set; }

    public bool IsPropertyInjected()
    {
        return B != null;
    }
}

public interface IServiceA
{
    bool IsPropertyInjected();
}

public class ServiceB : IServiceB{}
public interface IServiceB{}
...