运用反射实现多层和多数据库开发

简介:

 现在很多项目都须要为将来的扩展考虑,当然数据库也是一个很重我要的方面,扩展自己的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  {
 5InBlock.gif
 6ExpandedSubBlockStart.gif    /// <summary>
 7InBlock.gif    /// This class is implemented following the Abstract Factory pattern to create the DAL implementation
 8InBlock.gif    /// specified from the configuration file
 9ExpandedSubBlockEnd.gif    /// </summary>

10ExpandedSubBlockStart.gif    public sealed class DataAccess {
11InBlock.gif
12InBlock.gif        // Look up the DAL implementation we should be using
13InBlock.gif        private static readonly string path = ConfigurationManager.AppSettings["WebDAL"];
14InBlock.gif        private static readonly string orderPath = ConfigurationManager.AppSettings["OrdersDAL"];
15InBlock.gif        
16ExpandedSubBlockStart.gif        private DataAccess() { }
17InBlock.gif
18ExpandedSubBlockStart.gif        public static PetShop.IDAL.ICategory CreateCategory() {
19InBlock.gif            string className = path + ".Category";
20InBlock.gif            return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className);
21ExpandedSubBlockEnd.gif        }

22InBlock.gif
23ExpandedSubBlockStart.gif        public static PetShop.IDAL.IInventory CreateInventory() {
24InBlock.gif            string className = path + ".Inventory";
25InBlock.gif            return (PetShop.IDAL.IInventory)Assembly.Load(path).CreateInstance(className);
26ExpandedSubBlockEnd.gif        }

27InBlock.gif
28ExpandedSubBlockStart.gif        public static PetShop.IDAL.IItem CreateItem() {
29InBlock.gif            string className = path + ".Item";
30InBlock.gif            return (PetShop.IDAL.IItem)Assembly.Load(path).CreateInstance(className);
31ExpandedSubBlockEnd.gif        }

32InBlock.gif
33ExpandedSubBlockStart.gif        public static PetShop.IDAL.IOrder CreateOrder() {
34InBlock.gif            string className = orderPath + ".Order";
35InBlock.gif            return (PetShop.IDAL.IOrder)Assembly.Load(orderPath).CreateInstance(className);
36ExpandedSubBlockEnd.gif        }

37InBlock.gif
38ExpandedSubBlockStart.gif        public static PetShop.IDAL.IProduct CreateProduct() {
39InBlock.gif            string className = path + ".Product";
40InBlock.gif            return (PetShop.IDAL.IProduct)Assembly.Load(path).CreateInstance(className);
41ExpandedSubBlockEnd.gif        }

42InBlock.gif
43ExpandedSubBlockEnd.gif    }

44ExpandedBlockEnd.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,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 SQL 关系型数据库
数据库开发设计规范(通用)
数据库开发设计规范(通用)
127 0
|
2月前
|
存储 前端开发 关系型数据库
秀啊,用Python快速开发在线数据库更新修改工具
秀啊,用Python快速开发在线数据库更新修改工具
|
2月前
|
前端开发 数据库 虚拟化
太6了!用Python快速开发数据库入库系统
太6了!用Python快速开发数据库入库系统
|
2月前
|
前端开发 数据库 Python
用Python轻松开发数据库取数下载工具
用Python轻松开发数据库取数下载工具
|
2月前
|
关系型数据库 分布式数据库 数据库
安全可靠的国产自研数据库PolarDB V2.0,让数据库开发像“搭积木”一样简单!
安全可靠的国产自研数据库PolarDB V2.0,让数据库开发像“搭积木”一样简单!
|
2月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
37 1
|
2月前
|
XML 数据库 数据格式
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
这篇文章是Spring5框架的实战教程的终结篇,介绍了如何使用注解而非XML配置文件来实现JdbcTemplate的数据库操作,包括增删改查和批量操作,通过创建配置类来注入数据库连接池和JdbcTemplate对象,并展示了完全注解开发形式的项目结构和代码实现。
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
|
2月前
|
SQL 存储 Java
完整java开发中JDBC连接数据库代码和步骤
该博客文章详细介绍了使用JDBC连接数据库的完整步骤,包括加载JDBC驱动、提供连接URL、创建数据库连接、执行SQL语句、处理结果以及关闭JDBC对象的过程,并提供了相应的示例代码。
|
2月前
|
Java Spring 开发者
Java Web开发新潮流:Vaadin与Spring Boot强强联手,打造高效便捷的应用体验!
【8月更文挑战第31天】《Vaadin与Spring Boot集成:最佳实践指南》介绍了如何结合Vaadin和Spring Boot的优势进行高效Java Web开发。文章首先概述了集成的基本步骤,包括引入依赖和配置自动功能,然后通过示例展示了如何创建和使用Vaadin组件。相较于传统框架,这种集成方式简化了配置、提升了开发效率并便于部署。尽管可能存在性能和学习曲线方面的挑战,但合理的框架组合能显著提升应用开发的质量和速度。
33 0
下一篇
无影云桌面