写在前面:
最近没啥事,研究了一下web api的框架, 选型用的是dapper+autofac+mysql, 简单的三层架构,总体框架如下,刚开始没有设计的太复杂:
分层介绍:
1.APIDapperTool介绍:
APIDapperTool里面是封装的dapper的一些dapper的操作,以及对多数据库的支持,dapper是一个轻量级的orm工具,与其说是一个orm,还不如称呼为dbhelper。它是一个对数据库操作的封装,不需要装什么其他的组件,只需要在nuget里面安装dapper,一个单文件就能实现操作,对其他数据库的支持也非常好,数据库间的切换也非常方便:
DbConnectionFactory这个里面是对dapper连接的的封装,以及多数据库的支持,切换,代码如下:
public class DbConnectionFactory
{
/// 接收数据库类型,如:Oracle,MySQL,SqlServer。目前只支持者三种类型数据库的切换
private static string _dbType = string.Empty;
/// 数据库连接名
private static string _connection = string.Empty;
/// 获取连接名
private static string Connection
{
get { return _connection; }
//set { _connection = value; }
}
/// 返回连接实例
private static IDbConnection dbConnection = null;
#region 这种方式初始化属性值时,出现延迟的情况,导致静态方法被调用时,属性值为空,异常报错,因此弃用该方式,采用单例模式
//{
// get
// {
// string dbConnection = ConfigurationManager.AppSettings["DbConnection"].ToString();
// if (!string.IsNullOrEmpty(dbConnection) && dbConnection.Contains('_'))
// {
// //获取:数据库类型_连接名:SqlServer_SqlConnection
// string[] strArray = dbConnection.Split('_');
// //接收:数据库类型
// _dbType = strArray[0].ToUpper();
// //接收:数据库连接名
// _connection = ConfigurationManager.ConnectionStrings[strArray[1]].ConnectionString;
// }
// return _connection;
// }
//}
#endregion
/// 静态变量保存类的实例
private static DbConnectionFactory uniqueInstance;
/// 定义一个标识确保线程同步
private static readonly object locker = new object();
/// <summary>
/// 私有的构造方法,使外界不能创建该类的实例
/// </summary>
private DbConnectionFactory()
{
string dbConnection = ConfigurationManager.AppSettings["DbConnection"].ToString();
if (!string.IsNullOrEmpty(dbConnection) && dbConnection.Contains('_'))
{
//获取:数据库类型_连接名:SqlServer_SqlConnection
string[] strArray = dbConnection.Split('_');
//接收:数据库类型
_dbType = strArray[0].ToUpper();
//接收:数据库连接名
_connection = ConfigurationManager.ConnectionStrings[strArray[1]].ConnectionString;
}
}
/// <summary>
/// 全局访问点
/// </summary>
/// <returns>返回单一实例</returns>
public static DbConnectionFactory GetInstance()
{
// 当第一个线程运行到这里时,此时会对locker对象 "加锁",
// 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁
// lock语句运行完之后(即线程运行完之后)会对该对象"解锁"
// 双重锁定只需要一句判断就可以了
if (uniqueInstance == null)
{
lock (locker)
{
// 如果类的实例不存在则创建,否则直接返回
if (uniqueInstance == null)
{
uniqueInstance = new DbConnectionFactory();
}
}
}
return uniqueInstance;
}
/// <summary>
/// 根据 Appsetting配置中的数据库类型和连接名,打开当前配置的数据库连接。
/// </summary>
/// <returns></returns>
public static IDbConnection OpenCurrentDbConnection()
{