Castle学习笔记----ActiveRecord配置封装的解决方案
使用ActiveRecord开发的过程中我想大家都想到过,配置那么多要是不Ctrl+C/Ctrl+V还得自己去记在脑袋里,必然杂弄?
无论你是使用Hashtable,ArrayList等集合对象来处理还是使用web.config类配置或是使用XML文件单独配置,始终你都得记住或是让你的硬盘帮你记住ActiveRecord的配置串.方便你Ctrl+C/Ctrl+V.
[使用集合对象处理]
Hashtable properties = new Hashtable();
properties.Add("hibernate.connection.driver_class", "NHibernate.Driver.SqlClientDriver");
properties.Add("hibernate.dialect", "NHibernate.Dialect.MsSql2000Dialect");
properties.Ad("hibernate.connection.provider","NHibernate.Connection.DriverConnectionProvider");
properties.Add("hibernate.connection.connection_string", "Data Source=.;
Initial Catalog=test;Integrated Security=SSPI");
InPlaceConfigurationSource source = new InPlaceConfigurationSource();
source.Add(typeof(ActiveRecordBase), properties);
[使用xml配置节]
<activerecord>
<config>
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" />
<add key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"/>
<add key="hibernate.connection.connection_string"
value="Data Source=.;Initial Catalog=test;Integrated Security=SSPI" />
</config>
</activerecord>
使用上面这两种方式是不是都很麻烦,上周我在公司做项目的时候想到去写一个通用方法来处理ActiveRecord,个人觉得很不错,把思想写下来大家分享.
解决方案分析
针对这种情况,我的思路是把配置用方法封装起来,通过传递数据库名和项目实体数据程序集给方法,具体的实现交给方法封装方法去搞定,如下示:
因为Castle所支持的不只是MSSQL这一种数据库,MYSQL,DB2.......也支持,既然是通用方法,那考虑这一点是必要的.这里我采用了工厂模式,定义抽象类和抽象方法,让派生类来实现他,通过工厂根据需要调用不同的实现类方法:
定义实现类继承于这个抽象类并重写基类方法:
像这样Castle所支持多少数据库都可以通过工厂模式的思想来扩展.然后就是工厂的建立了.根据需要返回不同的操作.
根据所传参数来决定实力化那一个类进行相关的配置:
通过上面这样的思想处理过后,就可以直接调用方法就可以实现配置了.
注意:上面的代码只是给个思想,真正实现还是有很大的问题,我相信大家也都看出来了.里面还有很多逻辑都没写出.
主要原因是周公在催我了,请大家赎我对文章不负责之错,实在是没精神了.
无论你是使用Hashtable,ArrayList等集合对象来处理还是使用web.config类配置或是使用XML文件单独配置,始终你都得记住或是让你的硬盘帮你记住ActiveRecord的配置串.方便你Ctrl+C/Ctrl+V.
[使用集合对象处理]








[使用xml配置节]











使用上面这两种方式是不是都很麻烦,上周我在公司做项目的时候想到去写一个通用方法来处理ActiveRecord,个人觉得很不错,把思想写下来大家分享.
解决方案分析
针对这种情况,我的思路是把配置用方法封装起来,通过传递数据库名和项目实体数据程序集给方法,具体的实现交给方法封装方法去搞定,如下示:
因为Castle所支持的不只是MSSQL这一种数据库,MYSQL,DB2.......也支持,既然是通用方法,那考虑这一点是必要的.这里我采用了工厂模式,定义抽象类和抽象方法,让派生类来实现他,通过工厂根据需要调用不同的实现类方法:
1
public abstract class Initialize
2
{
3
public abstract void ActiveRecordInit(string dataBase,string model);
4
}

2

3

4

定义实现类继承于这个抽象类并重写基类方法:
1
public class ConnectionToSQL : Initialize
2
{
3
public override void ActiveRecordInit(string dataBase,string model)
4
{
5
//具体实现这里不贴代码,有需要的朋友E-mail我,
6
//或者我给个连接下载
7
}
8
}
9
public class ConnectionToMySQL : Initialize
10
{
11
public override void ActiveRecordInit(string dataBase,string model)
12
{
13
//**********************
14
}
15
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

像这样Castle所支持多少数据库都可以通过工厂模式的思想来扩展.然后就是工厂的建立了.根据需要返回不同的操作.
根据所传参数来决定实力化那一个类进行相关的配置:
1
public class CastleConfigFactroy
2
{
3
public static Initialize CreateInstance(string type)
4
{
5
switch (type)
6
{
7
case "SQL": return new ConnectionToSQL();
8
break;
9
case "MYSQL": return new ConnectionToMySQL();
10
break;
11
default: return new ConnectionToSQL();
12
}
13
}
14
}

2

3

4

5

6

7

8

9

10

11

12

13

14

通过上面这样的思想处理过后,就可以直接调用方法就可以实现配置了.
1
Initialize init=CastleConfigFactroy.CreateInstance("SQL");
2
init.ActiveRecordInit();

2

注意:上面的代码只是给个思想,真正实现还是有很大的问题,我相信大家也都看出来了.里面还有很多逻辑都没写出.
主要原因是周公在催我了,请大家赎我对文章不负责之错,实在是没精神了.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述