看了一些ASP.NET MVC开源项目后的一些想法,关于ASP.NET MVC+Repository+Service架构的一些思考 
最近在学习ASP.NET MVC 2.0的一些开源项目,发现这些项目中都普遍用到了同一种架构设计,即:

ASP.NET MVC + Service + Repository。从网上看了一些关于这方面的介绍后觉得这种架构确实满好的。以微软的一个典型的开源项目Oxite为例:

该项目由下面的Projects组成:

1)Oxite;

2)Oxite.LinqtoSqlDataProvider;

3)Oxite.Mvc;

4)Oxite.Mvc.Tests;

5)OxiteSite;

Oxite Project:

1)定义所有项目中需要用到的Model,即Entity,并且所有的Model都是纯Model,它们不依赖于任何ORM框架相关的信息。Model的作用是作为数据在UI层、业务逻辑层、数据访问层之间传递;

2)定义Repository接口。Repository和通常三层架构中的数据库访问层(DAL)从形式和功能上看差不多,个人感觉区别两者在意图上有所不同。
Repository是DDD(Domain-Driven Design 领域驱动模型 )中的概念,强调Repository是受Domain驱动的,Repository中定义的功能要体现Domain的意图和约束,而DAL更纯粹的就是提供数据访问的功能,并不严格受限于Business层。Repository所提供的一切接口都应该是业务逻辑层所需要的,如果业务逻辑不需要的,它就不必提供。但是最近看到网上有一些朋友实现了一些泛型的Repository接口,个人认为不是很好。因为这违背了我们设计Repository的初衷,Repository接口是提供给Domain层的操作契约,不同的Entity对于Domain来说可能有不同的操作约束,比如User可能不应该被删除,BookOrder可能不应该被修改,也就是说Domain层根本就不应该能调用_repository<User>.Delete(user),_repository<BookOrder>.Update(BookOrder)这样的操作。因此,Repository接口还是应该单独针对每个Entity类来定义。

3)定义和实现Service层。

Servide层定义和实现了整个应用程序的所有业务逻辑。Service利用Repository接口来完成数据库操作。每个Service接口除了利用Repository来操作数据库之外,还会做很多额外的事情,如数据验证等。

Oxite.LinqtoSqlDataProvider Project:

该项目是用 Linq to Sql ORM 技术实现的一个具体的 DataProvider(Repository)。该项目中会定义一些Linq to Sql ORM框架相关的Entities,借助于LINQ强大的语法功能,我们可以很方便的把这些Entities转换为Oxite中定义的Entity。如:

1 public User GetUser(string name)
 2 {
 3     return (from u in context.oxite_Users
 4             where string.Compare(u.Username, name, true) == 0
 5             select new User()
 6             {
 7                 ID = u.UserID,
 8                 Name = u.Username,
 9                 DisplayName = u.DisplayName,
10                 Email = u.Email,
11                 HashedEmail = u.HashedEmail,
12                 Password = u.Password,
13                 PasswordSalt = u.PasswordSalt,
14                 Status = u.Status
15             }).FirstOrDefault();
16 }

oxite_User是Linq to Sql ORM框架所生成的Entity,User就是Oxite Model中定义的Entity。

Oxite.Mvc Project:

该项目包含了所有的Controller,但不包含View;Controller负责利用Service层来为View提供服务。一般来说,只要是和ASP.NET MVC相关的技术,都不应该放在Service层中实现,而应该放在Controller中实现。这样可以确保Service层可以被非ASP.NET MVC技术的程序所重用。

OxiteSite Project:

该项目就是一个普通的ASP.NET MVC Website,但它仅仅包含了一些View以及js和css等。

总结:

上面的架构设计我觉得有以下三个好处:

1)Oxite project实际上已经完整的代表了的应用了。因为一个应用由UI、Business、Data三部分组成。而这个project包含了Business和Data,当然,应该说它包含了对整个应用程序的业务逻辑的描述,并没有包含具体的业务逻辑实现,具体的业务逻辑的数据持久化实现是通过Oxite.LinqtoSqlDataProvider这个项目实现的。但这并不影响我们把Oxite理解为整个应用的主体。所以我想这个项目就是ASP.NET MVC架构中的Model吧。

2)利用Repository模式,完全把应用程序的业务逻辑和数据持久化工作分离。所以我们完全可以编写很多不同的ORM框架来完成数据的持久化工作。我们唯一需要配置的就是在web.config文件中设置该使用哪一个DataProvider;当然,就Oxite这个开源项目而言,在Oxite.LinqtoSqlDataProvider中单独定义了另外一套Entity,导致我们在查询数据时必须要做一个Entity的转换。这一点也许是我觉得有点不好的地方吧。当然其实Linq to Sql是支持xml来配置ORM映射关系的。所以理论上应该支持不用另外定义一套Entity。

3)前台利用ASP.NET MVC技术实现,并且把Controller和View分离在不同的项目中实现。个人觉得主要的考虑是为了更好的团队开发。让开发View的人专注于设计View,而让Controller开发人员专注于View和Model之间的控制协调。

所以,可以设想,如果基于这样的架构开发一个应用,个人觉得可以先开发好Model,然后再开发一个或几个DataProvider来实现Model中定义的Business,然后可以写一个Test工程来测试这个Model,等Model稳定后,再去开发View和Controller。

关于ASP.NET MVC+Repository+Service架构的一些思考的更多相关文章

  1. 转载——Asp.Net MVC+EF+三层架构的完整搭建过程

    转载http://www.cnblogs.com/zzqvq/p/5816091.html Asp.Net MVC+EF+三层架构的完整搭建过程 架构图: 使用的数据库: 一张公司的员工信息表,测试数 ...

  2. Asp.Net MVC<一> : 三层架构、MVC

    MVC.MVP.MVVM.Angular.js.Knockout.js.Backbone.js.React.js.Ember.js.Avalon.js.Vue.js 概念摘录 认清Android框架 ...

  3. asp.net mvc 加三层架构 完美搭配

    http://www.hysql.org/aspnet/20180630/5712.html 先来一张项目的层级结构图: Model:模型层,主要是各种类型.枚举以及ORM框架,框架完成数据库和实体类 ...

  4. Asp.Net MVC简单三层架构(MVC5+EF6)

    三层架构与MVC的关系 三层架构是一个分层式的软件体系架构设计,分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).分层的目的是为了实现“高内聚,低耦合”的思想,有利于系统后期的维护.更 ...

  5. Asp.Net MVC+EF+三层架构的完整搭建过程

    架构图: 使用的数据库: 一张公司的员工信息表,测试数据 解决方案项目设计: 1.新建一个空白解决方案名称为Company 2.在该解决方案下,新建解决方案文件夹(UI,BLL,DAL,Model) ...

  6. Asp.Net MVC+EF+三层架构

    架构图: 使用的数据库: 一张公司的员工信息表,测试数据 解决方案项目设计: 1.新建一个空白解决方案名称为Company 2.在该解决方案下,新建解决方案文件夹(UI,BLL,DAL,Model) ...

  7. 《ASP.NET MVC 5 框架揭秘》

    <ASP.NET MVC 5 框架揭秘> 基本信息 作者: 蒋金楠 出版社:电子工业出版社 ISBN:9787121237812 上架时间:2014-8-1 出版日期:2014 年8月 开 ...

  8. Asp.net mvc 各个组件的分离

    1. 系统常见的分层 在开发asp.net mvc应用的时候,visual studio 给我们创建了默认的文档结构,一般情况下我们在一个项目下工作,参考微软的官方例子:ContosoUniversi ...

  9. 1.1 ASP.NET MVC简介

    1.什么是ASP.NET MVC? (1)它是个怎么样的产品? ASP.NET MVC是微软公司.NET平台上的一个Web开发框架,它为开发者提供了一种构建结构良好的Web应用程序的方式.自2007年 ...

随机推荐

  1. Java 栈与堆简介

    一.前言 长久以来,一直被Java的内存分配问题,堆和栈问题困扰好久,面试的时候也非常心虚,这几天好好通过看书和技术博客来整理了一下,希望能找到我自己的理解方式. 二.内存 内存分物理内存和虚拟内存, ...

  2. ettercap dns_spoof

    首先编辑网页,打开apache2服务器,编辑好etter.dns 然后开始ettercap -G 的操作 sniff选择好自己使用的网卡 scan hosts ,扫描完将目标和网关添加到目标一目标二 ...

  3. 20169214 2016-2017-2 《移动平台开发实践》Android程序设计 实验报告

    实验四 Android程序设计 课堂练习 实验题目 采用后缀表达式法,设计一个建议计算器,实现+.-.*./四种运算. 代码实现 码云链接 关键代码部分及结果如下: Android程序实验 Andro ...

  4. Java多线程设计模式(一)

    目录(?)[-] Java多线程基础 Thread类的run方法和start方法 线程的启动 线程的暂时停在 线程的共享互斥 线程的协调 Single Threaded Execution Patte ...

  5. opencv——pcb上寻找mark点(拟合椭圆的方法)

    #include "stdafx.h" // FitCircle.cpp : 定义控制台应用程序的入口 #include "cv.h" #include &qu ...

  6. memcached整理の分布式集群算法

    memcached如何实现分布式? memcached是一个“分布式内存对象缓存系统”,然而memcached并不像mongodb那样,允许配置多个节点,且节点之间“自动分配数据”,就是说memcac ...

  7. java简答题

    1.什么是java的平台无关性? Java源文件被编译成字节码的形式,无论在什么系统环境下,只要有java虚拟机就能运行这个字节码文件.也就是一处编写,处处运行.这就是java的跨平台性. 2.在一台 ...

  8. 在一台服务器上搭建相对高可用HiveServer实践

    本文来自网易云社区 作者:刘杰 问题及原因 组里之前搭建了一个hiveserver提供给猛犸上的ETL程序调用,hiveserver隔三差五地挂掉重启,网上查了些资料,也咨询了猛犸那边维护hivese ...

  9. jquery函数封装

    <script type="text/javascript"> $(function () { $("#tabMenu a").on('click' ...

  10. 张小龙演讲PPT

    35条核心要点 一.产品经理要求 1.了解人性 2.了解群体心理 3.产品经理像上帝一样,可建造系统,制定规则,让群体在系统中演化 4.提高自己的艺术品位.质量要求品位/细节体验品位:作品而非产品:工 ...