Asp.net mvc 3 如何在n层项目中构建MVC3、EF、ViewModels、AutoMapper、POCO、存储库和工作单元?

Asp.net mvc 3 如何在n层项目中构建MVC3、EF、ViewModels、AutoMapper、POCO、存储库和工作单元?,asp.net-mvc-3,repository-pattern,automapper,n-tier-architecture,Asp.net Mvc 3,Repository Pattern,Automapper,N Tier Architecture,我已经阅读了无数关于如何使用最佳实践构建新的MVC3应用程序的文章 90%的文章将EF EDMX文件与MVC应用程序合并到同一个项目中。那些将这些项目分离到自己项目中的人并没有明确每个项目进入哪个项目以及每个项目有哪些参考。通常,它们包含的代码片段非常适合教授如何实现特定功能,但不要告诉我如何构建解决方案 我相信我的解决方案中至少需要5个项目。有人能告诉我这里的布局是否正确吗 数据访问层-包含EF EDMX文件。(可能是DBContext自动生成的代码?) 业务层-包含IRepository和

我已经阅读了无数关于如何使用最佳实践构建新的MVC3应用程序的文章

90%的文章将EF EDMX文件与MVC应用程序合并到同一个项目中。那些将这些项目分离到自己项目中的人并没有明确每个项目进入哪个项目以及每个项目有哪些参考。通常,它们包含的代码片段非常适合教授如何实现特定功能,但不要告诉我如何构建解决方案

我相信我的解决方案中至少需要5个项目。有人能告诉我这里的布局是否正确吗

  • 数据访问层-包含EF EDMX文件。(可能是DBContext自动生成的代码?)
  • 业务层-包含IRepository和Repository类、UoW类以及域的业务逻辑。-包含对DAL的引用
  • ViewModels-包含将使用AutoMapper在我的DAL和表示层之间切换的ViewModels。-包含对DAL的引用
  • MVC 3应用程序-标准MVC 3应用程序。包含对BusinessLayer和ViewModels项目的引用
  • 测试单元测试
这个看起来对吗?有谁能给我推荐一篇使用n层开发、ViewModels、AutoMapper、Repository模式和EF4的好文章吗?

我喜欢以下内容

域-包含模型和视图模型

服务-业务逻辑和viewmodel水合(ie填充)代码

合同或接口-存储库接口、工作单元、IContext和ICache 网站 DataAccess—实体框架的具体实现

有些人将自动映射代码直接作为操作过滤器作为属性包含在web项目中。我的自动映射代码是在服务项目中完成的(但这同样取决于您),除非我可以在控制器中使用该属性

顺便说一句,看看吉米的好属性:


不过,您上面概述的内容也不错。这是一个非常主观的问题。我的一般建议是“如果有人能够打开一个项目,并且知道在哪里可以找到东西,那么你很可能会正确地完成它”

我通常的做法:

  • 模型项目-包含从数据库和上下文生成的模型
  • POCOs项目-包含业务实体
  • 控制器项目-类似于您的存储库
  • MVC3项目-前端,包括视图模型和包含automapper等效项的存储库类
  • 单元测试
  • 无论您使用的是EF、Hibernate、MVC、webforms等,体系结构都与技术无关。。。你通常会把图案组合起来。此外,这主要取决于每个特定的项目


    关于最佳实践,当谈到EF时,我无法将您链接到我使用的源代码,因为我使用的是一本书。不过,我会将您链接到,这是Julie Lerman的编程实体框架。

    在查看要放入什么项目时,考虑如何部署代码会有所帮助。将要在同一个项目中发布的代码放在一起,然后使用名称空间将其逻辑地划分为不同的层。对于我从事的大多数项目来说,它往往非常简单,只有3个项目

    业务层
    • 域/业务模型和服务
    • 数据访问层
    MVC应用程序
    • 视图模型
    • 汽车制造商
    • 控制器
    • 观点
    测验
    • 单元测试

    您在哪个领域?下个月我将在犹他州的宾夕法尼亚州做一个关于这个的演讲,尽管我很乐意参加你们的演讲!你应该把它录下来并进行网络广播!这难道不是打破了n层项目的整个概念吗?你的MVC应用程序不应该知道你的DAL,对吧?不。单独的项目不会在层之间强制分离。将业务层或表示层与DAL紧密耦合同样容易,即使它位于单独的项目中。如果以后我决定创建一个移动应用程序,那么将DAL移动到单独的项目可能会有帮助,因为移动框架可能没有我的web/desktop DAL所拥有的相同支持。值得一提的是,Jimmy不再推荐这种方法了,他现在建议将动作过滤器稍微更改为使用动作结果。您可以在标有“操作结果”的部分中看到这种方法: