【发布时间】:2015-06-08 11:52:09
【问题描述】:
假设我们有一个具有以下层的 ASP.NET MVC Web 应用程序:
- 业务逻辑
- 实体(业务领域和数据库 POCO)
- 通用(资源、常量)
- 数据访问(数据库 EF 查询、EDMX EF 模型等)
- Web 应用程序(MVC Web 应用程序)
我们正在使用视图模型方法。当前视图模型放置在实体层中。数据访问查询返回视图模型(由于效率问题,所以我们避免使用映射器)。
Web 层引用所有其他层。 数据访问引用 Common 和 Entity 层。 业务逻辑引用实体层和公共层,未来还会引用数据访问层。
有一个想法将视图模型移动到 Web 层。为什么?因为它们实际上与特定技术 (MVC) 和 UI 实现绑定在一起。 但是我们这里遇到了一个问题,因为在这个场景中数据访问层必须引用Web,Web引用数据访问,所以我们有循环依赖的问题。
此外,当某些视图模型验证需要引用数据访问层时,我们会遇到这种情况。我们将在视图模型中保留验证方法。目前我们希望通过构造函数将数据库上下文类(在数据访问层中)注入到视图模型中来实现它。
您知道如何避免它吗?将视图模型保留在我们的 Web 层中是个好主意吗?
【问题讨论】:
-
如何避免使用视图模型映射对象?为什么 Web 项目必须引用数据访问项目?还有为什么视图模型必须引用数据访问项目进行验证?
-
@gerdi 避免映射对象是通过返回视图模型来实现的。所以 EF 查询最后有“select new SomeVM { fields = sth }”行。 Web 引用数据访问,因为 DAL 公开了用于查询控制器中使用的数据库的方法。视图模型必须注入对数据访问项目的引用,因为某些验证方法必须检查数据库中的某些内容以验证视图模型(我们在视图模型中有 Validation 方法)。
-
你没有说明你是否使用依赖注入,这听起来像是一个 IoC 容器。
-
我们没有使用 DI,因为我们架构的某些其他方面使其难以实施。我说的是注入,但实际上我们正在创建访问基本控制器中的 db(假设是我们的工作单元对象)的对象。然后我们在视图模型构造函数中传递引用,以便它可以在其验证方法中使用它。无论如何 - IoC 不是答案,因为我们不能使用它。
-
那将是避免跑来跑去的一种方法。但老实说,我认为视图模型在哪个项目中并不太重要。在默认的 asp mvc 项目中,它们位于“web”部分。因为 VM 纯粹是 UI 层的新实体。将它们放在 Web 项目中可能更符合关注点分离。
标签: .net asp.net-mvc architecture