当前位置: 移动技术网 > IT编程>开发语言>.net > Farseer.net轻量级开源框架 中级篇:DbFactory数据工厂

Farseer.net轻量级开源框架 中级篇:DbFactory数据工厂

2018年10月25日  | 移动技术网IT编程  | 我要评论

马祖好玩吗,贺子豪,倩美

当然还有一些绑定技巧,比如把枚举、list<users>绑定到dorpdownlist、checkboxlist、radiobuttonlist 并显示中文 在下一篇中再解释。

 

这一篇中,我们主要讲解下用到的一个工厂模式的类:dbfactory。

 

国际惯例,先来看看这个类有哪些方法吧:全名空间,位于:fs.core.bean

 

复制代码

 1 namespace fs.core.bean

 2 {

 3     /// <summary>

 4     ///     工厂模式

 5     /// </summary>

 6     public class dbfactory

 7     {

 8         /// <summary>

 9         ///     创建数据库sql生成

10         /// </summary>

11         /// <typeparam name="tinfo">实体类</typeparam>

12         /// <param name="dbtype">数据库类型</param>

13         /// <param name="tablename">表名称</param>

14         internal static dbbuilder<tinfo> createdbbuilder<tinfo>(string tablename = "") where tinfo : modelinfo, new();

15 

16         /// <summary>

17         ///     创建数据库表达式树解析器

18         /// </summary>

19         /// <typeparam name="tinfo">实体类</typeparam>

20         /// <param name="dbtype">数据库类型</param>

21         /// <param name="tablename">表名称</param>

22         internal static dbvisit<tinfo> createdbvisit<tinfo>() where tinfo : modelinfo, new();

23 

24         /// <summary>

25         ///     创建修改数据库类

26         /// </summary>

27         /// <param name="dbtype">数据库类型</param>

28         /// <param name="connetionstring">连接字符串</param>

29         /// <param name="tablename">要操作的表名</param>

30         public static dboperate createdboperate(databasetype dbtype, string connetionstring, string tablename);

31 

32         /// <summary>

33         ///     创建数据库提供者

34         /// </summary>

35         public static dbprovider createdbprovider<tinfo>() where tinfo : modelinfo, new();

36 

37         /// <summary>

38         ///     创建数据库提供者

39         /// </summary>

40         /// <param name="dbtype">数据库类型</param>

41         public static dbprovider createdbprovider<tinfo>(databasetype dbtype);

42 

43         /// <summary>

44         ///     创建数据库操作

45         /// </summary>

46         /// <typeparam name="tinfo">实体类</typeparam>

47         /// <param name="tranlevel">开启事务等级</param>

48         public static dbexecutor createdbexecutor<tinfo>(isolationlevel tranlevel = isolationlevel.serializable) where tinfo : modelinfo, new();

49 

50         /// <summary>

51         ///     创建数据库操作

52         /// </summary>

53         /// <typeparam name="tinfo">实体类</typeparam>

54         /// <param name="tranlevel">开启事务等级</param>

55         public static dbexecutor createdbexecutor(int dbindex = 0, isolationlevel tranlevel = isolationlevel.unspecified);

56 

57 

58         /// <summary>

59         ///     创建数据库连接字符串

60         /// </summary>

61         /// <param name="dbinfo">数据库配置</param>

62         public static string createconnstring(int dbindex = 0);

63 

64         /// <summary>

65         ///     创建数据库连接字符串

66         /// </summary>

67         /// <param name="datatype">数据库类型</param>

68         /// <param name="userid">账号</param>

69         /// <param name="password">密码</param>

70         /// <param name="server">服务器地址</param>

71         /// <param name="catalog">表名</param>

72         /// <param name="dataver">数据库版本</param>

73         /// <param name="connecttimeout">链接超时时间</param>

74         /// <param name="poolminsize">连接池最小数量</param>

75         /// <param name="poolmaxsize">连接池最大数量</param>

76         /// <param name="port">端口</param>

77         public static string createconnstring(databasetype datatype, string userid, string password, string server, string catalog, string dataver, int connecttimeout = 60, int poolminsize = 16, int poolmaxsize = 100, string port = "");

78     }

79 }

复制代码

其实这里面主要是方法的调用,很简单。专门开一篇文章来讲,主要是考虑到这个类还是比较常用的。所以专门写了一篇这个文章,来加深大家的印象。

 

以上方法,大致分为:

 

createdbbuilder

createdbvisit

createdboperate

createdbprovider

createdbexecutor

createconnstring

以上六种。各自有一些重载版本。重载版本主要是对数据库配置的参数。可通过完全的手动编写数据库的选择,或者使用实体类映射,或者数据库配置三种方式。

 

提到数据库配置,可能大家会有疑问,那我的实体是怎么关联到数据库配置(dbconfig)的?我有多个数据库怎么办?请放心,这些框架都实现了,关于这个问题,在后面有专门的篇幅讲到。

 

现在一一来说明下这6个方法的作用吧。因为方法都比较简单。就各自说明下其作用就可以。

 

createdbbuilder

  创建dbbuilder。dbbuilder会因为不同的数据库类型,有相对应的派生类,比如有:sqlserverbuilder。

 

  而我们用工厂模式的目的,当然是为在切换数据库的时候,不用修改代码就可以正常运行。

 

  前面我们说到了很多insert、update、delete、tolist 等等方法。其实它们最终的目地就是为了转成sql语句,然后提交到数据库中。那么dbbuilder就是为了生成真正的sql而产生的。

 

  比如:

 

复制代码

 1         public override string totable(int pagesize, int pageindex)

 2         {

 3             if (map.classinfo.dataver == "2000") { return base.totable(pageindex, pagesize); }

 4             if (pageindex == 1) { return base.totable(pagesize); }

 5 

 6             if (sortstring.length == 0) { sortstring.appendformat("order by {0} asc", map.indexname); }

 7             return string.format(

 8                     "select {0} from (select {0},row_number() over({1}) as row from {2} {3}) a where row between {4} and {5};",

 9                     getfields(), sortstring, tablename, wherestring, (pageindex - 1) * pagesize + 1, pageindex * pagesize);

10         }

复制代码

  上面,是摘自sqlserverdbbuilder中的方法。用的是重写方法。我们再看看dbbuilder中的方法又是如何的(sqlserverdbbuilder继承自dbbuilder中):

 

复制代码

 1         public virtual string totable(int pagesize, int pageindex)

 2         {

 3             // 不分页

 4             if (pageindex == 1) { return totable(pagesize); }

 5             if (sortstring.length == 0) { sortstring.appendformat("order by {0} asc", map.indexname); }

 6 

 7             var sort2 = sortstring.tostring().replace(" desc", " [倒序]").replace("asc", "desc").replace("[倒序]", "asc");

 8 

 9             return string.format("select top {1} {0} from (select top {2} {0} from {3} {4} {5}) a  {6};",

10                                  getfields(), pagesize, pagesize * pageindex, tablename, wherestring, sortstring, sort2);

11         }

复制代码

  是个虚方法,我们利用了sqlserver row_number()的特性做了分页功能。所以我们不需要dbbuilder中的实现。

 

  到这里,大家明白了dbbuilder的作用了吧,就是用来生产sql的。

 

createdbvisit

  创建createdbvisit。createdbvisit会因为不同的数据库类型,有相对应的派生类,比如有:sqlservervisit。

 

  我们一直使用的是lambda表达式来做条件的。比如:where(o=>o.id == 1)  或者:select(o=>new { o.id,o.username } );

 

  那么dbvisit的目地就是用来解析这些过程。解析过程用的是对表达式树的解析:expression<func<实体类,bool>>

 

  将这些lbmbda表达式树进行解析成数据库所有识别的sql语句。换句说话就是解析表达式树expression

 

createdboperate

  创建createdboperate。createdboperate会因为不同的数据库类型,有相对应的派生类,比如有:sqlserveroperate。

 

  这个类的作用是对数据库进行物理操作。比如创建表、创建字段、删除字段、修改字段等。

 

  当然,通常我们对数据库的维护是使用sql server management studio ,但不除排有些项目,需要能实现让客户自定义物理字段的可能。(当然有些是利用json结构之类的,这里就不展开讲解了)

 

  这个方法比较少用到,大家有所了解就行。知道有这么个方法。具体需要使用的时候,可以在里查看返回的类里面所包含的有哪些方法。

 

createdbprovider

  创建createdbprovider。createdbprovider会因为不同的数据库类型,有相对应的派生类,比如有:sqlserverdbprovider。

 

  什么是dbprovider,我们先看下dbprovider的工作方式,如下图:

 

  

 

  每个数据库类型都会包含有自己的provider。 这个provider主要是提供数据库的特有的特性。

 

  举个例子,在sqlserver中。对于表名、字段名的保护符号是:[]  中括号。为了避免一些名称定义成sqlserver特有的关键词,可以理解为是一种转义符。而mysql用的是:  ‘’  两个单引号。

 

createdbexecutor

  创建createdbexecutor。框架最终执行,都是到这个类里把生成的sql传进来的。因此你也可以使用自己传进来的sql进行执行你想要的结果。

 

  前面两章:事务、sql执行都用到了这个方法。这里不作解讲了。

 

createconnstring

  创建createconnstring。创建数据库的连接字符串。我们知道不同的数据库、不同的数据库的版本,对应的connnectionstring 都会不一样。

 

  那么这个方法的目地就是为了创建不同数据库的连接字符串了。查看过~/app_data/db.config应该知道,为个配置文件,用的不是连接字符串,而是采用:

 

复制代码

 1 <?xml version="1.0"?>

 2 <dbconfig xmlns:xsi="https://www.w3.org/2001/xmlschema-instance" xmlns:xsd="https://www.w3.org/2001/xmlschema">

 3   <dblist>

 4     <dbinfo>

 5       <server>.</server>

 6       <userid>sa</userid>

 7       <password>123456</password>

 8       <datatype>sqlserver</datatype>

 9       <dataver>2005</dataver>

10       <catalog>farseer</catalog>

11       <poolminsize>16</poolminsize>

12       <poolmaxsize>100</poolmaxsize>

13       <connecttimeout>30</connecttimeout>

14       <commandtimeout>60</commandtimeout>

15     </dbinfo>

16   </dblist>

17 </dbconfig>

复制代码

这种格式进行对数据库的配置。那么,框架就是利用这个方法来生成数据库连接字符串的。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网