У нас есть решение с несколькими проектами, представляющими слои нашего приложения. например.
Домен
Данные
Логика
Веб-интерфейс
На наш контейнер Castle Windsor ссылаются из нашего веб-слоя, и затем мы каскадируем эти зависимости вверх по нашим слоям. Например...
// 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(), логический уровень не может, поэтому единственный способ каскадировать зависимость без помощи контейнеров - разрешить ее на веб-уровне, а затем передать ее вверх по цепочке, используя ее интерфейс.