我们有一个解决方案,其中包含多个代表我们应用程序层的项目。例如
领域
数据
逻辑
网页界面
我们的 Castle Windsor 容器是从我们的 Web 层引用的,然后我们将这些依赖关系通过我们的层级联起来。例如...
// 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();
这很好用,直到我们的经理有很多成员都有自己的依赖关系。当这种情况发生时,我们最终解决了管理器的依赖关系及其依赖关系,并将它们从 Web 层级联起来。这个结果是一些相当大的构造函数。
有没有更优雅的方式,例如让管理器的内部组件解决它自己的依赖关系而无需访问容器?
请记住,只有 web 层可以访问容器(以防止循环项目依赖),所以只有 web 层可以激活 WindsorContainer.Resolve() 逻辑层不能,所以只有在没有容器的帮助是在 web 层解决它,然后使用它的接口将它传递到链上。