Я использую 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
строка свойства фактически никогда не вызывается.