Возможно ли, чтобы Castle Windsor разрешал зависимости свойств, если у вас нет ссылки на контейнер?

У нас есть решение с несколькими проектами, представляющими слои нашего приложения. например.

Домен

Данные

Логика

Веб-интерфейс

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

5
задан Rich Andrews 11 April 2012 в 11:42
поделиться