多层架构+MVC+EF+AUTOFAC+AUTOMAPPER

多层架构+MVC+EF+AUTOFAC+AUTOMAPPER

 

  最近使用ligerui搭建了一个简单的教务管理demo,将重要的地方记录,也希望能帮到有这方面需要园友。


一、目录

 1、多层架构+MVC+EF+AUTOFAC+AUTOMAPPER;

 2、MVC中验证码的实现(经常用,记录备用)

二、正文

 多层架构中等以上规模以上的系统用得比较多,此demo功能不多,出于抱着学习的态度搭建了一个多层架构,并加入现在很流行的依赖倒转(autofac)、对象映射工具(automapper)。

 话说没图你说个J8,先上框架图:

  Model层中Entity存放数据库实体,使用code first,ViewModel存放界面展示模型。DAL层中IDAO存放接口,EFDAO实现IDAO。BLL结构与DAL类似,接口+实现。WEB层就是我们的UI层了,在这个框架中,WEB层使用MVC。什么,MVC不就是多层架构嘛,怎么还把它放Web层呢?MVC并不等同于多层架构,有这样疑问的同学,请在园内搜索相关文章。Infrastructure层是我们的基础设施层,我把一些常用的工具类封装后放入其中,方便其它地方调用。

  IDao中定义了一个公共基类,基类中定义所有子类都会用到的查询方法:

 IDAO

  EFDao有一个类实现这一公共基类:

 EFDAO

  可以看到,代码中都是使用的泛型。根据传入的实体类型决定访问莫一数据实体。

  倘若,我们有一个数据实体类叫做Admin,IDAO,EFDAO中可以分别添加Admin对应的DAL层文件:

 IAdminDao
 AdminEFDao

   IAdminDao继承我们上面定义的公共接口,AdminEFDao继承IAdminDao接口以及BaseEFDao基类,这样我们可以在IAdminDao中定义该数据实体特有的查询方法,同时复用了我们常用的查询以及增加、删除、编辑代码。至于为什么要使用接口,是为了满足面向对象原则的依赖倒转原则——抽象不依赖细节,细节应该依赖抽象。

  BLL层代码结构与DAL类似。

  一个简单的多层架构就是这样,各层之间引用关系从顶层向下调用底层,将各层之间耦合尽量降低。


  然后,谈谈配置autofac。

  这里,发现这工具很好,很强大,至于有多强大,我也不清楚,因为我也很菜(/ □ )……

  autofac配置园里相关文章也很多,我这里就初略的说说。

  First step:nuget上加入我们autofac的程序集引用:

  

  注意,根据你所使用的.net环境选择相应的程序集,目前最新的版本是3.1.0,低版本的autofac是不支持.net4.0的。我们这里使用了MVC4.0所以选择第二个。

  Second step:配置依赖注入,说白了就是告诉autofac你要将哪个类与接口“发生关系”。

  

  在这个框架中,我们将配置信息在图示类中完成:

  

 RegisterAutofacForSingle

  autofac有很多重配置方式,详询此处:http://www.cnblogs.com/hkncd/archive/2012/11/28/2792474.html

  好了,下面我们在全局文件Global.asax中调用刚才定义的方法:

  

 Global.asax

  至此,autofac的配置就基本OK。其是用也比较的方便,autofac是使用构造函数注入:

  

 FrameController

  这样就可以使用接口调用方法了。autofac简单配置完毕。


  接下来我们配置automapper:

  First Step:与autofac同样的方法在nuget里面安装。

  Secoud Step:

    

  我把automapper分为两部配置,第一步与autofac类似,首先注册,也就是告诉automapper组件,你要在哪两个Model之间映射:

 RegisterAutomapper

  代码中Formeber后面的代码可以不要,详情在这:http://www.cnblogs.com/ljzforever/archive/2011/12/29/2305500.html

  然后看看我们第二个文件MapperExtention:

  

 MapperExtention

  MapperExtention中定义了一个个拓展方法,添加这个文件会让我们在控制器中映射实体变得非常方便:

  

 List

  就向调用ToString()方法一样的使用。

  当然,我们的automapper还需要在Global文件中调用,这一步在autofac最后一张图中已经说明。

  下一篇,准备写一个mvc中验证码实现。


2013-11-29 21:26:00

 

QL SERVER字符串函数

 

本篇文章还是学习《程序员的SQL金典》内容的记录,此次将讲解的是SQL SERVER的字符串函数。

其实数据库跟程序语言库一样,都会集成很多可以使用的API。这些API,如果你熟悉的话,将减少在代码层次的再次加工操作。

我想字符串函数的使用价值还是很高的,所以我觉得一边学习一起把常用的东西都记录下来。一来加深自己的悟性,二来通过归纳使知识为我所用。

SQL SERVER支持的字符串函数(其它数据库这里就不罗列了,想看更多的可以关注《程序员的SQL金典》),本文将介绍如下内容:

  • LEN(string)函数
  • LOWER(string)函数
  • UPPER (string)函数
  • LTRIM(string)函数
  • RTRIM (string)函数
  • SUBSTRING(string,start_position,length)函数
  • CHARINDEX(string,substring)函数
  • LEFT (string,length)函数
  • RIGHT (string,length) 函数
  • ASCII(string)函数:
  • ASCII(string)函数:

(1)LEN(string)函数此函数是用来计算一个字符串的长度,接受一个参数(可以为表里面的一个字符串字段,也可以为别的)。这里面,是没有区分大小写(下面的函数都一样)。LEN,len,还是Len都等同。例子如下:

SELECT FName, LEN(FName) FROM T_Person

注:如果给LEN函数传递的参数是一个时间字段的话,那么返回的结果就不对,比如一个DateTime。所以呢,这个函数是用来计算字符串的长度,别的类型参数也能返回结果,但是就不一定正确。

I、如果传进去的是NULL,那么返回出来的还是NULL。

II、对于一个字符串形如' a a ',返回的结果是4,而不是5。即计算的结果不包括右侧全为空格字符串部分。

 (2)LOWER(string)函数此函数是用来把一字符串都转换为小写字符串。跟LEN()函数一样,也接受一个参数。

SELECT FName, LOWER(FName) FROM T_Person

注:如果传进去的是NULL,那么返回出来的还是NULL。

(3)UPPER (string)函数与LOWER()函数相反,此函数把字符串都转换为大写字符串。也同样接受一个参数。

SELECT FName, UPPER(FName) FROM T_Person

注:如果传进去的是NULL,那么返回出来的还是NULL。

(4)LTRIM(string)函数此函数是去除字符串左边的空格(对于夹在字符串里面的空格则无能为力)。也同样接受一个参数。

SELECT FName,LTRIM(FName),LTRIM(' abc ') FROM T_Person

注:如果传进去的是NULL,那么返回出来的还是NULL。

(5)RTRIM (string)函数此函数是去除字符串右边的空格(对于夹在字符串里面的空格则无能为力)。也同样接受一个参数。

SELECT FName,RTRIM(FName),RTRIM(' abc ') FROM T_Person

注:如果传进去的是NULL,那么返回出来的还是NULL。

如果需要去除两边的空格(对于夹在字符串里面的空格则无能为力),则需要联合来使用。

SELECT FName,LTRIM(RTRIM(FName)),LTRIM(RTRIM(' abc ')) FROM
T_Person

 (6)SUBSTRING(string,start_position,length)函数此函数是使用来获取子字符串。其中参数string为主字符串,start_position为子字符串在主字符串中的起始位置,length
为子字符串的最大长度。需要注意的是这里的start_position是从1开始,不同于数组是从0开始。如果给的是0的话,相当于取了一个''。

SELECT FName, SUBSTRING(FName,2,3) FROM T_Person

注:如果传进去的是NULL,那么返回出来的还是NULL。

(7)CHARINDEX(substring,string)函数此函数是计算子字符串在主字符串中位置。其中参数substring为子字符串,string为主字符串。这个函数可以检测制定的子字符串是否存在于主字符串中,如果存在则还可以返回所在的位置。假如有匹配的话,结果大于0。也就是匹配成功的话,至少从1开始。

SELECT FName,CHARINDEX('m', FName), CHARINDEX('ly', FName)
FROM T_Person

注:如果传进去的是NULL,那么返回出来的还是NULL。

(8)LEFT (string,length)函数此函数是实现从左侧开始取子字符串,其中参数string为主字符串,length为子字符串的最大长度。即取出来的结果是1至length范围内的子字符串。

SELECT FName, LEFT(FName,3) , LEFT(FName,2)
FROM T_Person

注:如果传进去的是NULL,那么返回出来的还是NULL。

这种方式等同于使用SUBSTRING(string,start_position,length)函数:

SELECT FName,SUBSTRING(FName, 1,3) FROM T_Person

(9)RIGHT (string,length) 函数此函数是实现从右侧开始取子字符串,其中参数string为主字符串,length为子字符串的最大长度。即取出来的结果是1至length范围内的子字符串。

SELECT FName, RIGHT(FName,3) , RIGHT(FName,2)
FROM T_Person

注:如果传进去的是NULL,那么返回出来的还是NULL。

这种方式等同于使用SUBSTRING(string,start_position,length)函数,其中SUBSTRING(string, LEN(string)- length+1, length)等价于RIGHT (string,length)。

SELECT FName, SUBSTRING(FName,LEN(FNAME)-2,3) , SUBSTRING(FName,LEN(FNAME)-1,2)
FROM T_Person

 (10)REPLACE(string,string_tobe_replace,string_to_replace)函数此函数是实现字符串的替换功能,其中参数string 为要进行替换操作的主字符串,参数string_tobe_replace 为要被替换的字符串,即string_to_replace将替换string_tobe_replace所有出现的地方。 

select FName,REPLACE(FName,'i','e'),FIDNumber,
REPLACE(FIDNumber,'2345','abcd') FROM T_Person

借助替换为''来实现删除字符串的功能:

SELECT FName, REPLACE(FName,'m','') ,FIDNumber,
REPLACE(FIDNumber,'123','') FROM T_Person

前面介绍过LTRIM(string)函数和RTRIM(string)函数,两者最终只能删除两侧的空格,而对于在字符串里面的空格,则无能为力。而借助于REPLACE函数则可以轻松解决。

SELECT REPLACE(' abc 123 wpf',' ','') , REPLACE(' ccw enet wcf f',' ','')

(11)ASCII(string)函数此函数用来得到一个字符的ASCII 码,它有且只有一个参数,这个参数为待求ASCII码的字符,如果参数为一个字符串则函数返回第一个字符的ASCII码。

SELECT ASCII('a') , ASCII('abc')

注:如果传进去的是NULL或者是'',那么返回出来的是NULL。

(12)CHAR(string)函数与(11)相反,此函数用来得到一个字符的ASCII 码。

SELECT CHAR(56) , CHAR(90) ,'a', CHAR( ASCII('a') )

注:如果传进去的是NULL,那么返回出来的是NULL。

(13)DIFFERENCE(string)函数此函数用来比较两个字符串的发音相似度,它可以计算两个字符串的发音特征值,并且比较它们,然后返回一个0至4 之间的一个值来反映两个字符串的发音相似度,这个值越大则表示两个字符串发音相似度越大。

SELECT DIFFERENCE(FName,'Merry') FROM T_Person

注:如果传进去的是NULL,那么返回出来的是NULL。

 以上的SQL代码都为《程序员的SQL金典》(作者:杨中科)例子,书中的例子更详细,又有相应的步骤查看结果。大家有兴趣的话,可以网上下载PDF文档看,当然购买正版书也是不错的选择。至此本文完。

 
 
标签: SQL
 
分类: Ligerui
原文地址:https://www.cnblogs.com/Leo_wl/p/3451889.html