域对象扩展方法中的依赖注入

时间:2011-02-18 13:40:32

标签: c# dependency-injection inversion-of-control

我正在asp.net mvc中创建一个基于节点的Web CMS系统。

阅读了一些有关依赖注入的书籍后,我将我的解决方案分成多个项目并使用抽象(抽象类和接口)。

我无法弄清楚如何在我的网络项目中解决以下类型的代码:

myDomainObjectNode.GetChildNodes<SomeSubNodeClass>();

如果域对象具有对INodeRepository的引用,我可以完成此操作,但这意味着我必须在所有域对象中携带这种依赖,这是一件麻烦事,特别是在必须创建新实例时。在您的域对象中具有依赖项(主要是存储库)是一件坏事吗?

我的另一个想法是使用扩展方法来实现这一点。但是,扩展方法在静态类上是静态的,静态类本身不能使用IoC构造。我可以使用Singleton为INodeRepository解决这个问题并让它由IoC设置。

这不是一个优雅的解决方案......你还有其他任何想法或意见吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

我通常会避免让域对象访问存储库并尽可能地隐藏任何持久性问题。

创建myDomainObjectNode时,您还可以填充一组子节点以保存具体的对象引用。这通常是建筑商或工厂的关注点。

我可能会删除泛型类型以过滤集合并只使用Linq,您的childnodes集合可能会返回IEnumerable<BaseNode>

当然,你可以使用各种延迟加载和缓存策略来增强它,这是典型的ORM可以帮助你的。

如果您决定使用域对象中的存储库,我倾向于通过构造函数注入它。这使得依赖项显而易见,并且您将其外部化。

答案 1 :(得分:0)

我最终使用MVC DependencyResolver解决了这个问题,在MVC Web项目的扩展方法中获取了一个INodeService。像魅力一样工作,我认为我没有打破任何严重的OO模式。