代码改变世界

Unity 在MVC上的应用(中:Repository)

2011-05-21 18:06  bugfly  阅读(3563)  评论(5编辑  收藏  举报

系列目录

  Unity 在MVC上的应用(上:思路整理)

  Unity 在MVC上的应用(中:Repository)

  Unity 在MVC上的应用(下:ORM)

  Unity 在MVC上的应用(扩展篇:JQuery AJAX)

  Unity 在MVC上的应用(扩展篇:事务控制-前篇ActionFilter)

  Unity 在MVC上的应用(扩展篇:事务控制-后篇Unit Of Work)

  Unity 在MVC上的应用(扩展篇:日志管理NLog)

正题

回顾上篇介绍,我们可以看到一个小小的Demo是多么的臃肿,这一篇我将完善Repository模式,和引入Mock技术,开始转入面向接口编程。

一如既往的风格,我们先来浏览一下项目物理结构图。XD

如果你有看过上一篇,你会发觉,这次少了两样东西,首先是一个模拟数据库的类和一些XXXRepository,由于我们今次是使用Moq去模拟数据库,所以没必要再实现一些硬性的组件类,而正如上篇所说,一个对象就要有一个Repository实现类,这是很恶心的,最求轻量的你想必是不允许这部分的重复劳动吧?话说,我上篇也写得很累,哈哈~

好了,既然刚提到的是Repository模式,我们就看看这次新添加的IRepository<T>接口吧。

这个接口提供了基本的数据访问操作,具体操作,每个程序员都有一套自己的定义,我们不深究为何要定义出这部分东西,能满足需求就OK了。这里我们只有接口没有具体的实现类,在下篇我们才引入ORM,那个时候才会有具体的实现类加入项目 XD,很遗憾的是这一篇依然没有引入Unity,我写文章的进度实在有点慢,(*^__^*) 嘻嘻……

由于开篇时说的是面向接口编程,所以上篇的那些new 对象的东西我全扔了,要说明的是直接new的后果会导致使用者和被使用者的形成一种强耦合关系,直接好处是前期开发很快速,但给维护和后期升级、更换技术支撑都带来很大的投入!用一句俗语说去形容这种耦合关系就是:牵一发动全身。前期爽,后期悲剧!XD

所以这次我们的HomeController里的东西就变成这个摸样了

刚才提到这次并没有引入Unity,而且又没有模拟数据库的类,聪明的你就会问,你是怎么获得获得数据的呢?XD,这就是这次使用Moq的原因了,Moq是Mock框架之一,如果你喜欢LINQ,你一定喜欢它的语法方式,用起来来也挺容易的,园子里有不少它的入门文章,很好学。好了这里就不在大虾们面前,班门弄斧了,XD

我们来看看如何模拟

 

要说明的是,new Mock<IRepository<Account>>()的意思是针对IRepository<Account>接口模拟出一个它的实现,相当于一个new XXX() 而这里的Setup()方法,意图是当你登录ID为HuntSoul,密码未123456的时候,find()方法返回的是一个名字为HuntSoul的对象,这里偷懒没写全Account对象的属性值,哈哈~能理解就OK。写这个DEMO的时候发现Moq好像不支持泛型委托的参数,所以无法调试成功,会报错,不过没关系啦,下篇我们讲引入ORM,那个时候就不需要模拟数据库操作了。这篇的代码就凑合看吧 XD.

下图是DEMO里的相关Action逻辑,可以和上篇对比一下。

完整Demo