using System;
using System.Collections;
using System.Reflection;
using CSFrameworkV4_5.Core;
using CSFrameworkV4_5.Core.CodeGenerator;
using CSFrameworkV4_5.Server.DataAccess.DAL_Base; namespace CSFrameworkV4_5.Server.DataAccess
{ /// <summary>
/// 加载的DAL数据访问层的类型,注意:此类必须放在数据访问层模块
/// </summary>
public static class DALTypeLoader
{
//哈希表, 保存已加载的DAL类的引用地址
private static Hashtable _LoadedDalTypes = null; //数据访问层的程序集
private static Assembly _DALAssembly = null; /// <summary>
/// 数据访问层的程序集
/// </summary>
public static Assembly DALAssembly
{
get
{
if (DALTypeLoader._DALAssembly == null)
DALTypeLoader._DALAssembly = typeof(DALTypeLoader).Assembly; return DALTypeLoader._DALAssembly;
}
} static DALTypeLoader()
{
_LoadedDalTypes = new Hashtable();
} /// <summary>
/// 跟据DAL类名创建数据层实例
/// </summary>
/// <param name="derivedClassName">DAL类名,如:CSFrameworkV4_5.Server.DataAccess.DAL_Business.dalSO</param>
/// <returns></returns>
internal static Type GetDALTypeByClassName(string derivedClassName)
{
Type T = DALTypeLoader.DALAssembly.GetType(derivedClassName, true, true);
return T;
} /// <summary>
/// 根据表名获取对应的DAL层
/// </summary>
/// <param name="tableName">表名</param>
/// <returns></returns>
internal static Type GetDALTypeByTableName(string tableName)
{
Type _DAL_Type = null; #region 获取DAL的Type类型 //哈希表存在该类,从哈希表取出.
if (_LoadedDalTypes.ContainsKey(tableName))
_DAL_Type = _LoadedDalTypes[tableName] as Type;
else
{
//获取DataAccess程序集中所有Public类
Type[] types = DALTypeLoader.DALAssembly.GetExportedTypes(); //枚举程序集中所有Public类
foreach (Type T in types)
{
//只查找dalBaseDataDict的子类
if (false == T.IsSubclassOf(typeof(dalBaseDataDict))) continue; //查找DefaultORM_UpdateMode特性
object[] atts = T.GetCustomAttributes(typeof(DefaultORM_UpdateMode), false);
if ((atts == null) || (atts.Length == )) continue; //该类有定义DefaultORM_UpdateMode特性
DefaultORM_UpdateMode att = atts[] as DefaultORM_UpdateMode;
if (ORM_Tools.GetTableName(att.ORM) == tableName)
{
_DAL_Type = T;
break;
}
} //第一次加载后添加到哈希表中, 基于性能优化.
if (_DAL_Type != null) _LoadedDalTypes.Add(tableName, _DAL_Type);
}
#endregion return _DAL_Type;
} /// <summary>
/// 根据ORM模型类全名获取对应的DAL层
/// </summary>
/// <param name="ORM_TypeName"></param>
/// <returns></returns>
internal static Type GetDALTypeByORM(string ORM_TypeName)
{
Type _DAL_Type = null; #region 获取_DAL_Type
//哈希表存在该类,从哈希表取出.
if (_LoadedDalTypes.ContainsKey(ORM_TypeName))
_DAL_Type = _LoadedDalTypes[ORM_TypeName] as Type;
else
{
//
//哈希表不存在,表示第一次加载,需要从CSFrameworkV4_5.Server.DataAccess程序集中查询该类
//
//获取DataAccess程序集中所有Public类
Type[] types = DALTypeLoader.DALAssembly.GetExportedTypes(); //枚举程序集中所有Public类
foreach (Type T in types)
{
//只查找dalBaseDataDict的子类
if (false == T.IsSubclassOf(typeof(dalBaseDataDict))) continue; //查找DefaultORM_UpdateMode特性
object[] atts = T.GetCustomAttributes(typeof(DefaultORM_UpdateMode), false);
if ((atts == null) || (atts.Length == )) continue; //该类有定义DefaultORM_UpdateMode特性
DefaultORM_UpdateMode att = atts[] as DefaultORM_UpdateMode;
if (false == att.IsOverrideClass) continue; //仅查找具体类(子类) //比较ORM的全名是否相同
if (att.ORM.FullName.ToUpper() == ORM_TypeName.ToUpper())
{
_DAL_Type = T;
break;
}
} //第一次加载后添加到哈希表中, 基于性能优化.
if (_DAL_Type != null) _LoadedDalTypes.Add(ORM_TypeName, _DAL_Type);
}
#endregion return _DAL_Type;
} } }

加载的DAL数据访问层的类型的更多相关文章

  1. 1.1 DAL数据访问层

    分布式(Distributed)数据访问层(Data Access Layer),简称DAL,是利用MySQL Proxy.Memcached.集群等技术优点而构建的一个架构系统.主要目的是解决高并发 ...

  2. iframe加载顺序导致数据访问出现问题

    背景: 一个页面A内有一个iframe,src指向了B页面. 问题: 页面A通过Ajax获取服务器数据,并赋值给了页面A的全局变量gData,页面B要用到页面A的数据gData.那么问题来了当B访问g ...

  3. 数据访问层DAL(数据库访问抽象类DataProvider)

    晒晒数据访问层DAL,看看你的项目数据访问层使用的是什么形式,数据访问性能比较 采用什么样的数据访问形式是软件编码很重要的一个环节,良好的数据访问形式不仅能够提搞代码的执行效率,协作能力,更重要的是对 ...

  4. ClownFish:比手写代码还快的通用数据访问层

    http://www.cnblogs.com/fish-li/archive/2012/07/17/ClownFish.html 阅读目录 开始 ClownFish是什么? 比手写代码还快的执行速度 ...

  5. 【原创】打造基于Dapper的数据访问层

    [原创]打造基于Dapper的数据访问层   前言 闲来无事,花几天功夫将之前项目里用到的一个数据访问层整理了出来.实现单个实体的增删改查,可执行存储过程,可输出返回参数,查询结果集可根据实际情况返回 ...

  6. 使用JDBC构建简单的数据访问层

    本教程的目的是使用Java编写的分离的层去访问数据库中的表,这一层通常称为数据访问层(DAL) 使用DAL的最大好处是通过直接使用一些类似insert()和find()的方法简化了数据库的访问操作,而 ...

  7. 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布

    在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...

  8. 数据访问层的改进以及测试DOM的发布

    数据访问层的改进以及测试DOM的发布 在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层 ...

  9. 实用ExtJS教程100例-010:ExtJS Form异步加载和提交数据

    ExtJS Form 为我们提供了两个方法:load 和 submit,分别用来加载和提交数据,这两个方法都是异步的. 系列ExtJS教程持续更新中,点击查看>>最新ExtJS教程目录 F ...

随机推荐

  1. PHP学习:set_time_limit,max_execution_time,sleep

    set_time_limit 设置脚本最大允许执行时间,可以在php脚本中使用, 参数为秒,如果为0,表示无时间限制: set_time_limit(seconds); max_execution_t ...

  2. RedHat可用的几处软件源

    rpmforge仓库 http://repoforge.org/use/ http://rpms.famillecollet.com/

  3. 60-python基础-python3-集合-集合常用方法-交集、并集、差集、对称差集-intersection(&)-union(|)-difference(-)-symmetric_difference()

    交集.并集.差集-intersection(&)-union(|)-difference(-) 1-intersection(&) s1.intersection(s2),返回s1和s ...

  4. 微信、qq网页二次分享

    二次分享是指,在APP或者浏览器分享到微信或者qq,然后从微信或者qq再分享到别的平台.如果不处理,再次分享出去的图片或者标题就不会显示,对用户非常不友好. 一.微信二次分享 官方接入文档:https ...

  5. poj 1845 Sumdiv (等比求和+逆元)

    题目链接:http://poj.org/problem?id=1845 题目大意:给出两个自然数a,b,求a^b的所有自然数因子的和模上9901 (0 <= a,b <= 50000000 ...

  6. java的任务

    1.完善现有的日志记录系统,对异常进行处理和记录 2.基于需求实现账号信息录入接口

  7. spring cloud学习一--Eureka服务注册与发现

    spring cloud Eureka是基于Netflix Eureka服务发现注册产品的二次封装,它提供了服务注册功能(Service Registry)和服务发现功能(Service Discov ...

  8. torchvision.transforms模块介绍

    torchvision.transforms模块 官网地址:https://pytorch.org/docs/stable/torchvision/transforms.html# torchvisi ...

  9. bzoj4244 & loj2878. 「JOISC 2014 Day2」邮戳拉力赛 括号序列+背包

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4244 https://loj.ac/problem/2878 题解 挺妙的一道题. 一开始一直 ...

  10. sublime text3 手动安装插件package control

    好久没写了,今天换了新电脑,先安装前端神器“sublime” 一,安装 下载sublime,官方网址:http://www.sublimetext.com/: 二.插件包安装( Package Con ...