У нас есть решение с несколькими проектами, представляющими слои нашего приложения. , например.Возможно ли, что Castle Windsor разрешает имущественные зависимости, если у вас нет ссылки на контейнер?
домена
данных
Logic
WebUI
Наш Виндзорский замок контейнера ссылки с нашего веб-слоя, и мы затем каскадом эти зависимостей через наши слои. Например ...
// In Domain
public interface IFooRepository
{
void DoSomething();
}
// In Data
public class FooRepository : IFooRepository
{
public void DoSomething()
{
// Something is done
}
}
// In Logic
public class MyThingManager
{
private readonly IFooRepository fooRepository;
public MyThingManager(IFooRepository fooRepository)
{
this.fooRepository = fooRepository;
}
public void AMethod()
{
this.fooRepository.DoSomething();
}
}
// In Web
// in some controller....
var newManager = new MyThingManager(WindsorContainer.Resolve<IFooRepository>());
newManager.DoSomething();
, и это работает прекрасно, пока у наших менеджеров не будет много членов, у которых есть свои собственные зависимости. Когда это происходит, мы в конечном итоге устраняем как зависимостей менеджеров, так и их зависимостей зависимостей и каскадируем их с веб-уровня. Это приводит к некоторым довольно крупным конструкторам.
Есть ли более элегантный способ, например, если внутренние компоненты менеджера разрешают его собственные зависимости без доступа к контейнеру?
Имейте в виду, что ТОЛЬКО веб-слой имеет доступ к контейнеру (чтобы предотвратить круговую зависимость проекта), так что только веб-слой может активировать WindsorContainer.Resolve() логический уровень не может, поэтому единственный способ каскадирования зависимость без помощи контейнеров заключалась в том, чтобы разрешить ее в веб-слое, а затем передать ее цепочке, используя ее интерфейс.
«В конечном итоге мы разрешаем как зависимостей менеджеров, так и их зависимостей от наложения и каскадирования их из веб-уровня». Я этого не понимаю. Когда вы используете инъекцию конструктора и позволяете контейнеру автоматически вводить зависимости в конструкторе типа, не должно быть никаких проблем. Показать немного больше кода визуализации этой проблемы может быть полезно. – Steven