运用反射实现多层和多数据库开发.doc_第1页
运用反射实现多层和多数据库开发.doc_第2页
运用反射实现多层和多数据库开发.doc_第3页
运用反射实现多层和多数据库开发.doc_第4页
运用反射实现多层和多数据库开发.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

现在很多项目都须要为将来的扩展考虑,当然数据库也是一个很重我要的方面,扩展自己的Provider,这就需要反射技术,虽然会对性能有所影响,但是性价比还是很高的哦,从PetShop和CommunityServer都可以看到反射技术啦,也可以说反射是最基本的啦,呵呵!他的老家是在System.Reflection,当我们要开工时首先就是要把他抓出来.要实现这一功能我们当然要知道Provider的程序集,和工作的类名了,在多层架够中才能让逻辑和数据进行沟通,这样也方便团队开发的协条款发展,我们通过PetShop和CommunityServer两个例子来说明一下. 我们先看看PetShop的反射技术,在配制文件中发现如下配制: 其实只从配制文件中得到程序集名称,一般程序集就是类所在命名空间,也就是编译后显示的DLL名称,那PetShop是怎样工作的,下面我们来看一下DataAccess类,这也可说成一个工厂,呵呵,我们来看一下代码:1usingSystem.Reflection;2usingSystem.Configuration;34namespacePetShop.DALFactory56/*/7/ThisclassisimplementedfollowingtheAbstractFactorypatterntocreatetheDALimplementation8/specifiedfromtheconfigurationfile9/10publicsealedclassDataAccess1112/LookuptheDALimplementationweshouldbeusing13privatestaticreadonlystringpath=ConfigurationManager.AppSettingsWebDAL;14privatestaticreadonlystringorderPath=ConfigurationManager.AppSettingsOrdersDAL;1516privateDataAccess()1718publicstaticPetShop.IDAL.ICategoryCreateCategory()19stringclassName=path+.Category;20return(PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className);212223publicstaticPetShop.IDAL.IInventoryCreateInventory()24stringclassName=path+.Inventory;25return(PetShop.IDAL.IInventory)Assembly.Load(path).CreateInstance(className);262728publicstaticPetShop.IDAL.IItemCreateItem()29stringclassName=path+.Item;30return(PetShop.IDAL.IItem)Assembly.Load(path).CreateInstance(className);313233publicstaticPetShop.IDAL.IOrderCreateOrder()34stringclassName=orderPath+.Order;35return(PetShop.IDAL.IOrder)Assembly.Load(orderPath).CreateInstance(className);363738publicstaticPetShop.IDAL.IProductCreateProduct()39stringclassName=path+.Product;40return(PetShop.IDAL.IProduct)Assembly.Load(path).CreateInstance(className);41424344 其中(PetShop.IDAL.IProduct)Assembly.Load(path).CreateInstance(className);就是将类进行反射,首先要载入程序集,然后再创进类实例,通过静态方法就可以直接调用接口的方法等,从而实现了继承接口的类的反射,同时也方便表现层的数据传输. 下面我们来看一下CommunityServer是怎么实现的,CS是一个大象极别的项目,所以他有很自己扩展Provider,那怎么样才能让他们工作呢?其实原理和上述的反射方法差不多,只不过CS用的是Object.GetTyp()而达到这项功能.当我第一次看到时,还一直为怎样传输ConnectionString&DataOwner而不解,后来打开源数据看了一下各个方法的注解后才理解.CS从自定的配制文件中读取Provider节点并缓存,这在CSConfiguration类中可以发现,在DataProviders类中就实现反射,通过能构造函数的反射查找最匹配的构造函数对类进行实例化,当然当他们遇到有ConnectionString&DataOwner两参数的构造函数时,就对其进行实例化,从而达到对他们值的传输. DataProviders1/-2/3/Copyright(c)TelligentSystemsCorporation.Allrightsreserved.4/5/-67usingSystem;8usingSystem.Configuration;9usingSystem.IO;10usingSystem.Reflection;11usingSystem.Web;12usingCommunityServer.Configuration;1314namespaceCommunityServer.Components1516/*/17/DataProvidersisresponibleforloadingandmanagingthevariousCSDataProviders18/19publicsealedclassDataProviders2021/*/22/Thisclasscannotbeinstantiated23/24privateDataProviders()25262728privatestaticvoidGetDataStoreParameters(ProviderdataProvider,outstringconnectionString,outstringdatabaseOwner)2930databaseOwner=dataProvider.AttributesdatabaseOwner;31if(databaseOwner=null|databaseOwner.Trim().Length=0)32databaseOwner=ConfigurationSettings.AppSettingsdataProvider.AttributesdatabaseOwnerStringName;3334connectionString=dataProvider.AttributesconnectionString;35if(connectionString=null|connectionString.Trim().Length=0)36connectionString=ConfigurationSettings.AppSettingsdataProvider.AttributesconnectionStringName;373839/*/40/CreatesaninstanceoftheproviderusingActivator.Thisinstanceshouldbe41/cachedsinceitisanexpesivieoperation42/43publicstaticobjectCreateInstance(ProviderdataProvider)4445/Findthecurrentattributes46stringconnectionString=null;/dataProvider.AttributesconnectionString;47stringdatabaseOwner=null;/dataProvider.AttributesdatabaseOwner;4849GetDataStoreParameters(dataProvider,outconnectionString,outdatabaseOwner);5051/Getthetype52Typetype=Type.GetType(dataProvider.Type);5354objectnewObject=null;55if(type!=null)5657newObject=Activator.CreateInstance(type,newobjectdatabaseOwner,connectionString);585960if(newObject=null)/Ifwecannotcreateaninstance,throwanexception61ProviderException(dataProvider.Name);6263returnnewObject;646566/*/67/CreatesandCachestheConstructorInfoforthespecifiedprovider.68/69publicstaticConstructorInfoCreateConstructorInfo(ProviderdataProvider)707172/TheassemblyshouldbeinbinorGAC,sowesimplyneed73/togetaninstanceofthetype74/75CSConfigurationconfig=CSConfiguration.GetConfig();76ConstructorInfoproviderCnstr=null;77try7879/stringproviderTypeName=(Provider)config.ProvidersproviderName).Type;80Typetype=Type.GetType(dataProvider.Type);8182/Insertthetypeintothecache83/84TypeparamTypes=newType2;85paramTypes0=typeof(string);86paramTypes1=typeof(string);8788providerCnstr=type.GetConstructor(paramTypes);899091catch9293ProviderException(dataProvider.Name);949596if(providerCnstr=null)97ProviderException(dataProvider.Name);9899returnproviderCnstr;100101102/*/103/CreatesaninstanceofthespecifiedproviderusingtheCached104/ConstructorInfofromCreateConstructorInfo105/106publicstaticobjectInvoke(ProviderdataProvider)107108objectparamArray=newobject2;109110111stringdbOwner=null;112stringconnstring=null;113114GetDataStoreParameters(dataProvider,outconnstring,outdbOwner);115116paramArray0=dbOwner;117paramArray1=connstring;118119returnCreateConstructorInfo(dataProvider).Invoke(paramArray);120121122Exception#regionException123privatestaticvoidProviderException(stringproviderName)124125CSConfigurationconfig=CSConfiguration.GetConfig();126HttpContextcontext=HttpContext.Current;127if(context!=null)128129130/Wecantloadthedataprovider131/132StreamReaderreader=newStreamReader(context.Server.MapPath(/Languages/+config.DefaultLanguage+/errors/DataProvider.htm);133stringhtml=reader.ReadToEnd();134reader.Close();135136html=html.Replace(DATAPROVIDERCLAS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论