『飞秋』关于ASP.NET MVC+Repository+Service架构的一些思考

看了一些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开源项目的一点小小的思考,欢迎大家批评指正。
飞秋官网:http://www.freeeim.com/

『飞秋』关于ASP.NET MVC+Repository+Service架构的一些思考相关推荐

  1. 『飞秋』在ASP.NET服务器端过程中使用WebBrowser的注意事项

    昨天刚刚完成了一个从网页上提取内容的ASP.NET程序.因为目标网页内容比较复杂,所以采用了WebBrowser来代替WebClient. 但是,在本地写好的程序,放到了服务器上就停止工作了,也找不到 ...

  2. 『飞秋』Windows7新功能体验(1):为Windows 7 Media Center安装网络电视(Internet TV)

    『飞秋』Windows7新功能体验(1):为Windows 7 Media Center安装网络电视(Internet TV) 在Windows 7许多的新功能里,娱乐功能也做了很大的改进: Dire ...

  3. 『飞秋』小项目心得交流

    『飞秋』小项目心得交流 <!--[endif]--> 最近网站首页改版,我负责前台页面的编写,一个很小的任务,从中我却学习到了很多东西,现总结一下 和大家分享一下,希望对大家有用,也希望能 ...

  4. 『飞秋』在.NET 4中调用GDAL库时遇到的问题及解决方法

    『飞秋』在.NET 4中调用GDAL库时遇到的问题及解决方法 最近需要在.NET 4的环境中调用GDAL库.GDAL本身是一套非托管类库,不过还好提供了用SWIG做的托管的Wrapper. 可以在FW ...

  5. 『飞秋』Html.Label的缺陷及补救办法

    在最近开发的项目中,应用了Html.LabelFor(TModel)来生成<lable/>标签,同时配合Html.TextBoxFor(TModel)来生成<Input/>标签 ...

  6. 『飞秋』WCF热门问题编程示例

    WCF热门问题编程示例(4):WCF客户端如何异步调用WCF服务? Posted on 2010-08-01 14:28 Frank Xu Lei 阅读(296) 评论(3) 编辑 收藏 所属分类: ...

  7. 『飞秋』测试驱动开发TDD系列(二)

    引言 今天我们来做一个TDD的小例子.通过一个栈的实现来体验一下TDD的过程.在本系列的代码示例中,使用VS2010作为IDE工具,NUnit作为测试辅助工具.关于NUnit的使用,在园子中已经有很多 ...

  8. 微软项目技术结构思路 ExtJs/JQuery + Asp.net MVC + Wcf service + Entity Framework

    正文: 这一阵子在做一个项目, 客户要求使用ExtJs/ vs2008 sql server 2005, 也是好长时间没有去看新的技术和一些框架; 初步设计是准备使用 ExtJs + HTTPHand ...

  9. 【转】ASP.NET MVC 3 Service Location, Part 5: IDependencyResolver

    What's New Since Preview 1? We shipped ASP.NET MVC 3 Beta today, and with it we've made some signifi ...

最新文章

  1. Dataset之BDD100K:BDD100K数据集的简介、下载、使用方法之详细攻略
  2. StringFormat
  3. java查看上下文加载器_线程上下文类加载器
  4. 初二下册计算机考试试题,2017下半年计算机等级考试二级Java模拟试题及答案(18)...
  5. 网络——获取Web数
  6. JS当中的无限分类递归树
  7. python3创建类_python3 metaclass--创建类的过程分析
  8. 深圳出差 第一天【原创】
  9. Ericsson面试经验总结及自我反省
  10. requests爬取图片(百思不得其姐)
  11. 计算机毕业设计-基于神经网络APP-整合Vue+SpringBoot+TensorFlow框架-诗联AI
  12. uni-app解析及配置(小程序对应的转换)
  13. 4.0 RTL8723DU驱动(wifi+蓝牙)
  14. 表白套路计算机公式,数学公式的超酷表白
  15. mysql自我介绍_自我介绍
  16. 关键遥信量性能缺失的分析报告
  17. 夫琅禾费单缝衍射matlab分析,夫琅禾费单缝衍射光强分布MATLAB分析毕业设计论文...
  18. src源dst目的ccf期刊
  19. win10 Snipaste 截图软件
  20. 我的好友、我关注的人、关注我的人

热门文章

  1. 2021年Q3小红书美妆行业营销报告
  2. 考研复习安排——第一阶段末
  3. Android心电数据分析,Android SurfaceView+Canvas画脉搏/心电数据图-Go语言中文社区
  4. k2p华硕系统怎么设置_Linux怎么设置系统环境变量之export命令详解
  5. 作者:李茹姣(1976-),女,博士,中国科学院北京基因组研究所生命与健康大数据中心高级工程师...
  6. 【正则表达式】IPv4地址的正则匹配
  7. TensorFlow 之快速上手详解
  8. 关于WPF中Popup中的一些用法的总结
  9. RabbitMQ 关键词解释
  10. centos7安装redmine3,并升级redmine1.8到3