博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
运用反射实现多层和多数据库开发
阅读量:5897 次
发布时间:2019-06-19

本文共 2813 字,大约阅读时间需要 9 分钟。

 现在很多项目都须要为将来的扩展考虑,当然数据库也是一个很重我要的方面,扩展自己的Provider,这就需要反射技术,虽然会对性能有所影响,但是性价比还是很高的哦,从PetShop和CommunityServer都可以看到反射技术啦,也可以说反射是最基本的啦,呵呵!他的老家是在System.Reflection,当我们要开工时首先就是要把他抓出来.

  要实现这一功能我们当然要知道Provider的程序集,和工作的类名了,在多层架够中才能让逻辑和数据进行沟通,这样也方便团队开发的协条款发展,我们通过PetShop和CommunityServer两个例子来说明一下.
  我们先看看PetShop的反射技术,在配制文件中发现如下配制:

None.gif
        
<!--
 Pet Shop DAL configuration settings 
-->
None.gif        
<
add 
key
="WebDAL"
 value
="PetShop.SQLServerDAL"
/>
None.gif        
<
add 
key
="OrdersDAL"
 value
="PetShop.SQLServerDAL"
/>
None.gif        
<
add 
key
="ProfileDAL"
 value
="PetShop.SQLProfileDAL"
/>
  
其实只从配制文件中得到程序集名称,一般程序集就是类所在命名空间,也就是编译后显示的DLL名称,那PetShop是怎样工作的,下面我们来看一下DataAccess类,这也可说成一个工厂,呵呵,我们来看一下代码:
 1
None.gif
using
 System.Reflection;
 2
None.gif
using
 System.Configuration;
 3
None.gif
 4
ExpandedBlockStart.gif
namespace
 PetShop.DALFactory 
{
 5
InBlock.gif
 6
ExpandedSubBlockStart.gif    
///
 
<summary>
 7
InBlock.gif    
///
 This class is implemented following the Abstract Factory pattern to create the DAL implementation
 8
InBlock.gif    
///
 specified from the configuration file
 9
ExpandedSubBlockEnd.gif    
///
 
</summary>
10
ExpandedSubBlockStart.gif
    
public
 
sealed
 
class
 DataAccess 
{
11
InBlock.gif
12
InBlock.gif        
//
 Look up the DAL implementation we should be using
13
InBlock.gif
        
private
 
static
 
readonly
 
string
 path 
=
 ConfigurationManager.AppSettings[
"
WebDAL
"
];
14
InBlock.gif        
private
 
static
 
readonly
 
string
 orderPath 
=
 ConfigurationManager.AppSettings[
"
OrdersDAL
"
];
15
InBlock.gif        
16
ExpandedSubBlockStart.gif        
private
 DataAccess() 
{ }
17
InBlock.gif
18
ExpandedSubBlockStart.gif        
public
 
static
 PetShop.IDAL.ICategory CreateCategory() 
{
19
InBlock.gif            
string
 className 
=
 path 
+
 
"
.Category
"
;
20
InBlock.gif            
return
 (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className);
21
ExpandedSubBlockEnd.gif        }
22
InBlock.gif
23
ExpandedSubBlockStart.gif        
public
 
static
 PetShop.IDAL.IInventory CreateInventory() 
{
24
InBlock.gif            
string
 className 
=
 path 
+
 
"
.Inventory
"
;
25
InBlock.gif            
return
 (PetShop.IDAL.IInventory)Assembly.Load(path).CreateInstance(className);
26
ExpandedSubBlockEnd.gif        }
27
InBlock.gif
28
ExpandedSubBlockStart.gif        
public
 
static
 PetShop.IDAL.IItem CreateItem() 
{
29
InBlock.gif            
string
 className 
=
 path 
+
 
"
.Item
"
;
30
InBlock.gif            
return
 (PetShop.IDAL.IItem)Assembly.Load(path).CreateInstance(className);
31
ExpandedSubBlockEnd.gif        }
32
InBlock.gif
33
ExpandedSubBlockStart.gif        
public
 
static
 PetShop.IDAL.IOrder CreateOrder() 
{
34
InBlock.gif            
string
 className 
=
 orderPath 
+
 
"
.Order
"
;
35
InBlock.gif            
return
 (PetShop.IDAL.IOrder)Assembly.Load(orderPath).CreateInstance(className);
36
ExpandedSubBlockEnd.gif        }
37
InBlock.gif
38
ExpandedSubBlockStart.gif        
public
 
static
 PetShop.IDAL.IProduct CreateProduct() 
{
39
InBlock.gif            
string
 className 
=
 path 
+
 
"
.Product
"
;
40
InBlock.gif            
return
 (PetShop.IDAL.IProduct)Assembly.Load(path).CreateInstance(className);
41
ExpandedSubBlockEnd.gif        }
42
InBlock.gif
43
ExpandedSubBlockEnd.gif    }
44
ExpandedBlockEnd.gif}
   
其中(PetShop.IDAL.IProduct)Assembly.Load(path).CreateInstance(className);就是将类进行反射,首先要载入程序集,然后再创进类实例,通过静态方法就可以直接调用接口的方法等,从而实现了继承接口的类的反射,同时也方便表现层的数据传输.
   下面我们来看一下CommunityServer是怎么实现的,CS是一个大象极别的项目,所以他有很自己扩展Provider,那怎么样才能让他们工作呢?其实原理和上述的反射方法差不多,只不过CS用的是Object.GetTyp()而达到这项功能.当我第一次看到时,还一直为怎样传输ConnectionString&DataOwner而不解,后来打开源数据看了一下各个方法的注解后才理解.
 
  CS从自定的配制文件中读取Provider节点并缓存,这在CSConfiguration类中可以发现,在DataProviders类中就实现反射,通过能构造函数的反射查找最匹配的构造函数对类进行实例化,当然当他们遇到有ConnectionString&DataOwner两参数的构造函数时,就对其进行实例化,从而达到对他们值的传输.
 
ContractedBlock.gif
DataProviders

本文转自网魂小兵博客园博客,原文链接:http://www.cnblogs.com/xdotnet/archive/2006/10/11/use_system_reflection_easy.html,如需转载请自行联系原作者

你可能感兴趣的文章
仿射变换
查看>>
视频直播点播nginx-rtmp开发手册中文版
查看>>
PHP队列的实现
查看>>
单点登录加验证码例子
查看>>
[T-SQL]从变量与数据类型说起
查看>>
occActiveX - ActiveX with OpenCASCADE
查看>>
BeanUtils\DBUtils
查看>>
python模块--os模块
查看>>
Java 数组在内存中的结构
查看>>
《关爱码农成长计划》第一期报告
查看>>
学习进度表 04
查看>>
谈谈javascript中的prototype与继承
查看>>
时序约束优先级_Vivado工程经验与各种时序约束技巧分享
查看>>
minio 并发数_MinIO 参数解析与限制
查看>>
flash back mysql_mysqlbinlog flashback 使用最佳实践
查看>>
mysql存储引擎模式_MySQL存储引擎
查看>>
python类 del_全面了解Python类的内置方法
查看>>
java jni 原理_使用JNI技术实现Java和C++的交互
查看>>
java 重写system.out_重写System.out.println(String x)方法
查看>>
配置ORACLE 11g绿色版客户端和PLSQL远程连接环境
查看>>