【发布时间】:2013-03-12 02:40:31
【问题描述】:
我目前正在阅读 Mark Seemann 的“.NET 中的依赖注入”。我想知道编写 DDD ASP.NET MVC 应用程序的最佳方式是什么。
在简化的场景中,一般的经验法则是拥有作为应用程序核心的域模型,并且不会依赖于数据层或表示。它将暴露 Presentation 将使用的某些接口(因此依赖)和 Data Layer 将实现(因此依赖)。所以一切都很好,很清楚。
但是,现在,当我们编写应用程序时。对于 ASP.NET MVC 应用程序,我们将在 global.asax (http://blog.ploeh.dk/2011/07/28/CompositionRoot) 中执行此操作。我们的组合根需要依赖所有层,因为它需要注册所有适用的类型。
这使得所有的依赖关系看起来很混乱,现在表示层有一个对数据访问层的项目引用(在 VS 术语中)。开发人员很容易犯错,直接使用数据访问层的类型,这将有效地耦合这些层。
有没有一种干净的方法来解决这个难题?将 Composition Root 放在表示层之外几乎会很好,但在 MVC 中这是不可能的。
更新
在问了这个问题后,我找到了一个相关的问题: DAL -> BLL <- GUI + composition root. How to setup DI-bindings? 它有一些有趣的解决方案。公认的解决方案几乎是完美的,但是我希望组合根位于表示层之外,并参考表示层而不是其他方式。
其中一个原因是对我来说它在概念上更清晰 - 构图应该放在最重要的位置。另一个原因是,在我的情况下,表示层中已经有许多 DI 对象(主要是用于查看模型映射器的域对象),我也希望将它们组合在一个位置。
虽然这个帖子给了我一些想法,但我认为我正在尝试做的事情可能是可能的。
【问题讨论】:
-
我在 ASP.net MVC 中使用 DDD 几乎与您想要实现的目标完全一样。我直接从 UI 项目(在
Global.asax中)使用 Ninject 注入所有实现。所有其他类都接收它们需要使用的接口作为参数(因此它们不负责创建对象)。这个项目很大,但这种方法效果很好。例如,如果我想从 Web 更改为桌面,我只需要重新初始化接口(可能再次使用 Ninject),其他都不需要更改 -
It is easy for a developer to make a mistake and use types form Data Access layer directly, which would effectively couple those layers。无论您如何尝试阻止它,很多愚蠢的事情都很容易发生。不要根据用户可能不会做的事情来为您的应用程序建模。对其进行建模,以便正确地做事。 -
我同意@jgauffin。您应该始终进行代码审查。即使您确实信任其他开发人员以正确的方式做事。如果你不信任 hem,你可能应该做更多的代码审查。
-
再说一次,这不是您问题的答案,但是图形中看起来漂亮而干净的设计可以掩盖隐藏的复杂性 - 特别是不必要的抽象。您可能会使用演示代码污染您的域类。见 Ayende 的帖子:ayende.com/blog/4784/…
标签: asp.net-mvc asp.net-mvc-3 dependency-injection domain-driven-design