【发布时间】:2012-04-23 16:36:35
【问题描述】:
我们有一个解决方案,其中包含多个代表我们应用程序层的项目。 例如
域名
数据
逻辑
网页界面
我们的 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 层中解决它,然后使用它的接口将它传递到链上。
【问题讨论】:
-
“我们最终解决了管理器的依赖关系及其依赖关系的依赖关系,并将它们从 Web 层级联起来”。我不明白这一点。当你使用构造函数注入,让容器自动将依赖注入到一个类型的构造函数中,应该完全没有问题。显示更多可视化此问题的代码可能会有所帮助。
标签: c# dependency-injection castle-windsor ioc-container