#region
using System;
using System.Collections;
using System.Globalization;
using System.IO;
using System.Reflection;
using CSFrameworkV5.Common;
using CSFrameworkV5.Core;
using CSFrameworkV5.Core.CodeGenerator;
#endregion
namespace CSFrameworkV5.DataAccess
{
///
/// 数据访问层的对象工厂
///
public static class DALFactory
{
#region 通过.NET反射机制,加载数据字典数据访问层(dalBaseDataDict)的类型
//哈希表, 保存已加载的DAL类的引用地址
private static Hashtable _DalTypes = new Hashtable();
private static Hashtable _OrmTypes = new Hashtable();
//通过.NET反射机制,加载数据字典数据访问层(dalBaseDataDict)的类型
static DALFactory()
{
try
{
//应用程序根目录
var rootPath =
Path.GetDirectoryName(typeof(DALFactory).Assembly.Location);
//加载开发框架数据访问层核心库(如:CSFrameworkV5.DataAccess.dll,您的项目.DataAccess.dll)
LoadDalType(typeof(DALFactory).Assembly);
//加载CSFrameworkV5.DemoDAL.DLL
var demoPath = Path.Combine(rootPath, Globals.DEF_DEMO_DAL);
if (File.Exists(demoPath))
LoadDalType(Assembly.LoadFrom(demoPath));
//模拟加载其它扩展DAL层的DLL文件
//string otherPath = System.IO.Path.Combine(rootPath, "MyDataAccess.dll");
//if (System.IO.File.Exists(otherPath))
// LoadDalType(Assembly.LoadFrom(otherPath));
}
catch (Exception ex)
{
Msg.Warning("DALFactory静态类构造函数报错!" + ex.Message);
}
}
///
/// 加载DAL层的所有类
///
///
public static void LoadDalType(Assembly asmDAL)
{
try
{
//获取DataAccess程序集中所有Public类
var types = asmDAL.GetExportedTypes();
//枚举程序集中所有Public类
foreach (var T in types)
{
//注意:只查找dalBaseDataDict的子类!!!
// dalBaseBusiness类暂不支持DefaultORM_UpdateMode特性
if (false == T.IsSubclassOf(typeof(dalBaseDataDict)))
continue;
//查找DefaultORM_UpdateMode特性
var atts =
T.GetCustomAttributes(typeof(DefaultORM_UpdateMode),
false);
if (atts == null || atts.Length == 0) continue;
//该类有定义DefaultORM_UpdateMode特性
var att = atts[0] as DefaultORM_UpdateMode;
//获取ORM的表名
var tableName = ORM_Tools.GetTableName(att.ORM);
if (!_DalTypes.ContainsKey(tableName))
_DalTypes.Add(tableName, T);
//获取ORM的全名(Fullname)
var ORMTypeName = att.ORM.FullName;
if (!_DalTypes.ContainsKey(ORMTypeName))
_DalTypes.Add(ORMTypeName, T);
//将ORM模型的Type添加到哈希表
if (!_OrmTypes.ContainsKey(tableName))
_OrmTypes.Add(tableName, att.ORM);
if (!_OrmTypes.ContainsKey(ORMTypeName))
_OrmTypes.Add(ORMTypeName, att.ORM);
}
}
catch (Exception ex)
{
Msg.ShowException(ex);
}
}
///
/// 根据表名获取对应的DAL层
///
/// 表名
///
internal static Type GetDALTypeByTableName(string tableName)
{
if (_DalTypes.ContainsKey(tableName))
return _DalTypes[tableName] as Type;
return null;
}
///
/// 根据ORM模型类全名获取对应的DAL层
///
/// ORM模型的全名
///
internal static Type GetDALTypeByORM(string ORM_TypeName)
{
if (_DalTypes.ContainsKey(ORM_TypeName))
return _DalTypes[ORM_TypeName] as Type;
return null;
}
///
/// 获取DAL类
///
/// DAL类名
///
internal static Type GetDALTypeByClassName(string dalClassName)
{
foreach (Type T in _DalTypes)
if (T.FullName.ToLower() == dalClassName.ToLower())
return T;
return null;
}
///
/// 获取ORM类
///
/// 表名或ORM类全名(Fullname)
///
internal static Type GetORMType(string key)
{
if (_OrmTypes.ContainsKey(key)) return (Type)_OrmTypes[key];
return null;
}
#endregion
#region DALFactory静态类的方法
///
/// 跟据参数创建建数据层实例
///
/// 账套编号
/// 表名,可为空
/// DAL类的命名空间全名,可为空,如:CSFrameworkV5.DataAccess.DAL_Business.dalSO
///
public static dalBaseDataDict CreateDal(Loginer loginer, string DBID,
string tableName)
{
var dal = CreateDalByTableName(loginer, tableName);
if (loginer.DBID != DBID && !string.IsNullOrEmpty(DBID))
dal.Database = DatabaseProvider.GetDatabase(DBID);
return dal;
}
///
/// 跟据资料表名创建数据层实例,DAL类的特性定义了DefaultORM_UpdateMode特性,判断表名获取DAL
///
/// 当前登录用户
/// 资料表名,如tb_Customer
///
public static dalBaseDataDict CreateDalByTableName(Loginer loginer,
string tableName)
{
if (string.IsNullOrEmpty(tableName))
throw new CustomException("没有指定表名,无法创建实例!");
var DAL_Type = GetDALTypeByTableName(tableName); //DAL类定义
var ORM_Type = GetORMType(tableName);
//不可删除!没有找到对应的DAL层,返回基础实例
if (DAL_Type == null)
return new dalBaseDataDict(loginer, tableName);
//throw new CustomException("根据表名" + tableName + "创建DAL失败!");
//创建DAL实例,对应dalBaseDataDict(Loginer loginer)构造器
var instance = (dalBaseDataDict)DAL_Type.Assembly.CreateInstance(
DAL_Type.FullName, true,
BindingFlags.CreateInstance, null,
new object[] { loginer }, CultureInfo.CurrentCulture, null);
if (instance.ORM == null) instance.ORM = ORM_Type;
return instance;
}
///
/// 跟据ORM类全名自动创建DAL对象实例
///
/// 当前登录用户
/// ORM类的命名空间,如:CSFrameworkV5.DataAccess.DAL_Business.dalSO
///
public static dalBaseDataDict CreateDalByORM(Loginer loginer,
string ORM_TypeName)
{
if (string.IsNullOrEmpty(ORM_TypeName))
throw new CustomException("ORM类名为空,无法创建实例!");
var ORM_Type = GetORMType(ORM_TypeName);
if (ORM_Type == null) return null;
var DAL_Type = GetDALTypeByORM(ORM_TypeName); //DAL类定义
//没有找到指定的数据层,预设为数据字典基类
if (DAL_Type == null) return new dalBaseDataDict(loginer, ORM_Type);
try
{
//创建DAL实例,对应dalBaseDataDict(Loginer loginer)构造器
var instance =
(dalBaseDataDict)DAL_Type.Assembly.CreateInstance(
DAL_Type.FullName, true,
BindingFlags.CreateInstance, null,
new object[] { loginer }, CultureInfo.CurrentCulture,
null);
if (instance.ORM == null) instance.ORM = ORM_Type;
return instance;
}
catch (Exception ex)
{
Msg.ShowException(ex);
return null;
}
}
///
/// 跟据ORM类类型自动创建DAL对象实例
///
/// 当前登录用户
/// ORM类类型,如typeof(tb_Customer)
///
public static dalBaseDataDict CreateDalByORM(Loginer loginer,
Type ORM_Type)
{
if (ORM_Type == null)
throw new CustomException("ORM类型不能为空,无法创建实例!");
var DAL = CreateDalByORM(loginer, ORM_Type.FullName);
if (DAL == null) DAL = new dalBaseDataDict(loginer, ORM_Type);
return DAL;
}
#endregion
}
}