欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Farseer.net轻量级开源框架 中级篇:自定义配置文件

程序员文章站 2022-04-14 10:17:30
 目前提供了多个配置文件,一些开发过程中常用到的一些配置。     既然是配置,那么说明一些设置可能会根据项目的不同而有所不同。比如web.config其实就是个配置文件。  ...
 目前提供了多个配置文件,一些开发过程中常用到的一些配置。

 

  既然是配置,那么说明一些设置可能会根据项目的不同而有所不同。比如web.config其实就是个配置文件。

 

  当我们定义好配置文件后,在项目运行的时调用了配置,都将在:~/app_data/  文件夹中生成(如果不存在这个配置文件)。这个大家要记住。

 

系统提供了哪些配置文件

  目前系统提供了(命名空间:fs.configs):

 

fs.configs.dbconfigs.cs           // 配置

fs.configs.generalconfigs.cs    // 常规配置

fs.configs.systemconfigs.cs       // 系统配置

fs.configs.rewriterconfigs.cs      // url重写配置

fs.configs.emailconfigs.cs           // 邮件账号配置

fs.configs.cacheconfigs.cs          // 缓存配置

  先说说如何使用:

 

复制代码

 1         /// <summary>

 2         ///     返回配置的实体

 3         /// </summary>

 4         public static t configinfo

 5 

 6         /// <summary>

 7         ///     保存(序列化)指定路径下的配置文件

 8         /// </summary>

 9         /// <param name="t">config配置</param>

10         public static bool saveconfig(t t = null)

复制代码

  这里只有两个方法,一个是读取,另一个是保存。t 是泛型,指的配置类。我们的配置是class 类结构。我们以数据库配置dbconfigs举例

 

复制代码

 1 namespace fs.configs

 2 {

 3     /// <summary>

 4     ///     全局

 5     /// </summary>

 6     public class dbconfigs : baseconfigs<dbconfig> { }

 7 

 8     /// <summary>

 9     ///     默认数据库路径

10     /// </summary>

11     [serializable]

12     public class dbconfig

13     {

14         /// <summary>

15         ///     数据库连接列表,从/app_data/db.configs读取回来

16         /// </summary>

17         public list<dbinfo> dblist = new list<dbinfo>();

18     }

19 

20     /// <summary>

21     ///     数据库连接配置

22     /// </summary>

23     public class dbinfo

24     {

25         /// <summary>

26         ///     数据库连接串

27         /// </summary>

28         public string server { get; set; }

29 

30         /// <summary>

31         ///     数据库帐号

32         /// </summary>

33         public string userid { get; set; }

34 

35         /// <summary>

36         ///     数据库密码

37         /// </summary>

38         public string password { get; set; }

39 

40         /// <summary>

41         ///     端口号

42         /// </summary>

43         public string port { get; set; }

44 

45         /// <summary>

46         ///     oracle sid

47         /// </summary>

48         public string sid { get; set; }

49 

50         /// <summary>

51         ///     数据库类型

52         /// </summary>

53         public databasetype datatype { get; set; }

54 

55         /// <summary>

56         ///     数据库版本

57         /// </summary>

58         public string dataver { get; set; }

59 

60         /// <summary>

61         ///     数据库目录

62         /// </summary>

63         public string catalog { get; set; }

64 

65         /// <summary>

66         ///     数据库表前缀

67         /// </summary>

68         public string tableprefix { get; set; }

69 

70         /// <summary>

71         ///     最小连接池

72         /// </summary>

73         public int poolminsize { get; set; }

74 

75         /// <summary>

76         ///     最大连接池

77         /// </summary>

78         public int poolmaxsize { get; set; }

79 

80         /// <summary>

81         ///     数据库连接时间限制,单位秒

82         /// </summary>

83         public int connecttimeout { get; set; }

84 

85         /// <summary>

86         ///     数据库执行时间限制,单位秒

87         /// </summary>

88         public int commandtimeout { get; set; }

89 

90         /// <summary>

91         ///     通过索引返回实体

92         /// </summary>

93         public static implicit operator dbinfo(int index)

94         {

95             return dbconfigs.configinfo.dblist.count <= index ? null : dbconfigs.configinfo.dblist[index];

96         }

97     }

98 }

复制代码

  dbconfigs继承了baseconfigs,泛型传入了dbconfig 的类。而dbconfig类里的属性是list<dbinfo>  这样我们不难看出,因为数据库配置是个多配置的。有时你的项目用了多个不同物理地址的数据库。

 

  假设我们现在有个配置文件,如下图,是存放在~/app_data/db.config 中的,以xml结构存储(序列化)

 

复制代码

 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>

复制代码

  那我们要读取这个配置是,只需要简单的操作即可:

 

1         // 返回数据库配置文件中第1个索引的配置。

2         fs.configs.dbinfo config = fs.configs.dbconfigs.configinfo.dblist[0];

  对其重写了操作符号,因此可以更简单的调用,两者是同等的:

 

1         // 返回数据库配置文件中第1个索引的配置。

2         fs.configs.dbinfo config = 0;

  这样我们就可以读取配置文件的值,来进行调用了。另外也支持写入并保存(序列化)到文件中:

 

复制代码

1         // 返回数据库配置文件中的配置。

2         fs.configs.dbconfig dbconfig = fs.configs.dbconfigs.configinfo;

3         // 修改第1个配置文件的server节点

4         dbconfig.dblist[0].server = "192.168.1.1";

5         // 添加新的配置

6         dbconfig.dblist.add(new fs.configs.dbinfo() { server = "." });

7         // 保存

8         fs.configs.dbconfigs.saveconfig(dbconfig);

复制代码

  读者可能会问,那如果我手动在文件中修改了配置呢?比如在:~/app_data/db.config 文件 用记事本打开手动修改之后,我要怎么重新读取?

 

  细心的读者会发现,这里只有读取、保存,并没有reload方法。因为开头也提到了。配置文件是会缓存起来的。

 

  farseer在每次访问这个缓存之前都做了一个检查,就是检查配置文件的最后保存时间。如果与缓存的文件保存时间不一致,那么就会自动重新去硬盘上读取并缓存哦。

 

 

 

数据库配置 dbconfigs.cs

  上文中已经贴出了类的结构,这里就不重复贴了。在这里提一下一些细节的地方。

 

  dataver数据库版本:此处填的是:2000、2005、2008 这种格式,有关版本,可以到dbfactory.createconnstring 查看

 

  tableprefix表前缀:有可能你的实际物理数据库中的表都有共同的一个前缀。在处此可以设置。

 

常规配置 generalconfigs.cs

复制代码

 1 namespace fs.configs

 2 {

 3     /// <summary>

 4     ///     全局

 5     /// </summary>

 6     public class generalconfigs : baseconfigs<generalconfig> { }

 7 

 8     /// <summary>

 9     ///     网站基本设置描述类, 加[serializable]标记为可序列化

10     /// </summary>

11     [serializable]

12     public class generalconfig

13     {

14         // 此处省略

15     }

16 }

复制代码

  rewriterdomain:重写域名替换(多个用;分隔)  这个是在重写配置文件中使用的。在下几篇的url地址重写教程中会提到这里的使用。大家知道他是用;分隔的就行了。

 

系统配置 systemconfigs.cs

复制代码

 1 namespace fs.configs

 2 {

 3     /// <summary>

 4     ///     系统配置

 5     /// </summary>

 6     public class systemconfigs : baseconfigs<systemconfig> { }

 7 

 8     /// <summary>

 9     ///     配置文件

10     /// </summary>

11     [serializable]

12     public class systemconfig

13     {

14         // 此处省略

15     }

16 }

复制代码

  这里的timeout的配置。都是有关到session、cookies 超时的默认值时间。并且包括了保存key的前缀。这样有利于多个项目的不冲突。

 

url重写配置 rewriterconfigs.cs

复制代码

 1 namespace fs.configs

 2 {

 3     /// <summary>

 4     ///     全局

 5     /// </summary>

 6     public class rewriterconfigs : baseconfigs<rewriterconfig> { }

 7 

 8     /// <summary>

 9     ///     重写地址规则

10     /// </summary>

11     [serializable]

12     public class rewriterconfig

13     {

14         // 此处省略

15     }

16 }

复制代码

邮件账号配置 emailconfigs.cs

复制代码

 1 namespace fs.configs

 2 {

 3     /// <summary>

 4     ///     全局

 5     /// </summary>

 6     public class emailconfigs : baseconfigs<emailconfig> { }

 7 

 8     /// <summary>

 9     ///     email配置信息类

10     /// </summary>

11     [serializable]

12     public class emailconfig

13     {

14         /// <summary>

15         ///     email配置,从/app_data/db.configs读取回来

16         /// </summary>

17         public list<emailinfo> emaillist = new list<emailinfo>();

18     }

19 

20     /// <summary>

21     ///     e-mail配置

22     /// </summary>

23     public class emailinfo

24     {

25         // 此处省略

26     }

27 }

复制代码

缓存配置 cacheconfigs.cs

复制代码

 1 namespace fs.configs

 2 {

 3     /// <summary>

 4     ///     缓存配置

 5     /// </summary>

 6     public class cacheconfigs : baseconfigs<cacheconfig> { }

 7 

 8     /// <summary>

 9     ///     缓存配置

10     /// </summary>

11     [serializable]

12     public class cacheconfig

13     {

14         // 此处省略

15     }

16 }

复制代码

  还记得普通逻辑层:basemodel中的data.cache 属性吗?他们是如何工作的。这个在普通逻辑层里也介绍过了。

 

如何自定义配置

  前面介绍了框架预先写好的一些配置,从这些配置文件里,也容易看出,实质上,只需要大家在写好配置类后,继承baseconfigs<t>就可以实现配置文件的管理了。

 

  baseconfigs<t> 将对派生类进行序列化、反序列化的托管。