且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

[CommunityServer]自定义扩展Provider的实现.

更新时间:2022-09-13 08:07:46

自定义扩展Provider当然要有自己的配制文件,在上一编文章中我们介绍了文件CommunityServer.config,在CORE节点我们可找到<provider>节点,这个配制,今天我们来看看从读取到实现的整个过程.当然我们的程序可能只有个别Provider需要扩展就不需要自己配制一个文件,我们可以通过在Web.config文件中配制一个节点用来存储Provider或直接放在<appSettings>中.

  下面我们来看看provider的配制文件:
 
[CommunityServer]自定义扩展Provider的实现.PROVIDER

  从上面可以看到,provider主要包括两个配制,一个是name:用于搜索用的唯一provider名称;type:工作类的程序集和类,一定要按照"类,程序集"的顺序,不然会出错的哦,不信你试试!当然还有其它配制,在CS中可以将其它配制存在一个NameValueCollection中,这样就可以随便扩展而不要写他的实体类了,这也是值得我们学习的地方啊。

  知道了配置文件,我们可以从CSConfiguration.cs文件中找到Provider的实体类,通过CSConfiguration类将其读取并缓存,这样能提高效率。关于怎样读取,我想回用XML的人都懂得,这里就不多说了,下面来看看代码。
[CommunityServer]自定义扩展Provider的实现.ProviderEntity

  Nme就是上面所说的配置节点中的name属性;Type就是type属性,将其他的如ConnectionString等保存在Attributes中,我们可以通过key&value来读取。到这里我们已经读取了provider配置,但要实现provider还需要通过反射技术,在DataProviders可以看到,这个类主要用于数据库的扩展类,一些非数据库的类大多用SingletonProviderHelper来实现,原理都差不多,主要DataProviders通过查找最匹配的具有(string connectionString,string dataOwrer)来对其实例化,在CSlReWriter类中就可以看到用SingletonProviderHelper来对其虚函数进行实例化。

  1[CommunityServer]自定义扩展Provider的实现.public sealed class DataProviders
  2[CommunityServer]自定义扩展Provider的实现.    {
  3[CommunityServer]自定义扩展Provider的实现.        /// <summary>
  4[CommunityServer]自定义扩展Provider的实现.        /// This class can not be instantiated
  5[CommunityServer]自定义扩展Provider的实现.        /// </summary>

  6[CommunityServer]自定义扩展Provider的实现.        private DataProviders()
  7[CommunityServer]自定义扩展Provider的实现.        {
  8[CommunityServer]自定义扩展Provider的实现.        }

  9[CommunityServer]自定义扩展Provider的实现.
 10[CommunityServer]自定义扩展Provider的实现.        private static void GetDataStoreParameters(Provider dataProvider, out string connectionString, out string databaseOwner)
 11[CommunityServer]自定义扩展Provider的实现.        {
 12[CommunityServer]自定义扩展Provider的实现.            databaseOwner = dataProvider.Attributes["databaseOwner"];
 13[CommunityServer]自定义扩展Provider的实现.            if(databaseOwner == null || databaseOwner.Trim().Length == 0)
 14[CommunityServer]自定义扩展Provider的实现.                databaseOwner = ConfigurationSettings.AppSettings[dataProvider.Attributes["databaseOwnerStringName"]];
 15[CommunityServer]自定义扩展Provider的实现.
 16[CommunityServer]自定义扩展Provider的实现.            connectionString = dataProvider.Attributes["connectionString"];
 17[CommunityServer]自定义扩展Provider的实现.            if(connectionString == null || connectionString.Trim().Length == 0)
 18[CommunityServer]自定义扩展Provider的实现.                connectionString = ConfigurationSettings.AppSettings[dataProvider.Attributes["connectionStringName"]];
 19[CommunityServer]自定义扩展Provider的实现.        }

 20[CommunityServer]自定义扩展Provider的实现.
 21[CommunityServer]自定义扩展Provider的实现.        /// <summary>
 22[CommunityServer]自定义扩展Provider的实现.        /// Creates an instance of the provider using Activator. This instance should be
 23[CommunityServer]自定义扩展Provider的实现.        /// cached since it is an expesivie operation
 24[CommunityServer]自定义扩展Provider的实现.        /// </summary>

 25[CommunityServer]自定义扩展Provider的实现.        public static object CreateInstance(Provider dataProvider)
 26[CommunityServer]自定义扩展Provider的实现.        {
 27[CommunityServer]自定义扩展Provider的实现.            //Find the current attributes
 28[CommunityServer]自定义扩展Provider的实现.            string connectionString = null//dataProvider.Attributes["connectionString"];
 29[CommunityServer]自定义扩展Provider的实现.            string databaseOwner = null;// dataProvider.Attributes["databaseOwner"];
 30[CommunityServer]自定义扩展Provider的实现.
 31[CommunityServer]自定义扩展Provider的实现.            GetDataStoreParameters(dataProvider, out connectionString, out databaseOwner);
 32[CommunityServer]自定义扩展Provider的实现.
 33[CommunityServer]自定义扩展Provider的实现.            //Get the type
 34[CommunityServer]自定义扩展Provider的实现.            Type type  = Type.GetType(dataProvider.Type);
 35[CommunityServer]自定义扩展Provider的实现.
 36[CommunityServer]自定义扩展Provider的实现.            object newObject = null;
 37[CommunityServer]自定义扩展Provider的实现.            if(type != null)
 38[CommunityServer]自定义扩展Provider的实现.            {
 39[CommunityServer]自定义扩展Provider的实现.                newObject =  Activator.CreateInstance(type,new object[]{databaseOwner,connectionString});  
 40[CommunityServer]自定义扩展Provider的实现.            }

 41[CommunityServer]自定义扩展Provider的实现.            
 42[CommunityServer]自定义扩展Provider的实现.            if(newObject == null//If we can not create an instance, throw an exception
 43[CommunityServer]自定义扩展Provider的实现.                ProviderException(dataProvider.Name);
 44[CommunityServer]自定义扩展Provider的实现.
 45[CommunityServer]自定义扩展Provider的实现.            return newObject;
 46[CommunityServer]自定义扩展Provider的实现.        }

 47[CommunityServer]自定义扩展Provider的实现.
 48[CommunityServer]自定义扩展Provider的实现.        /// <summary>
 49[CommunityServer]自定义扩展Provider的实现.        /// Creates and Caches the ConstructorInfo for the specified provider. 
 50[CommunityServer]自定义扩展Provider的实现.        /// </summary>

 51[CommunityServer]自定义扩展Provider的实现.        public static ConstructorInfo CreateConstructorInfo (Provider dataProvider) 
 52[CommunityServer]自定义扩展Provider的实现.        {
 53[CommunityServer]自定义扩展Provider的实现.
 54[CommunityServer]自定义扩展Provider的实现.            // The assembly should be in \bin or GAC, so we simply need
 55[CommunityServer]自定义扩展Provider的实现.            // to get an instance of the type
 56[CommunityServer]自定义扩展Provider的实现.            //
 57[CommunityServer]自定义扩展Provider的实现.            CSConfiguration config = CSConfiguration.GetConfig();
 58[CommunityServer]自定义扩展Provider的实现.            ConstructorInfo providerCnstr = null;
 59[CommunityServer]自定义扩展Provider的实现.            try 
 60[CommunityServer]自定义扩展Provider的实现.            {
 61[CommunityServer]自定义扩展Provider的实现.                //string providerTypeName = ((Provider) config.Providers[providerName]).Type;
 62[CommunityServer]自定义扩展Provider的实现.                Type type  = Type.GetType( dataProvider.Type );
 63[CommunityServer]自定义扩展Provider的实现.
 64[CommunityServer]自定义扩展Provider的实现.                // Insert the type into the cache
 65[CommunityServer]自定义扩展Provider的实现.                //
 66[CommunityServer]自定义扩展Provider的实现.                Type[] paramTypes = new Type[2];
 67[CommunityServer]自定义扩展Provider的实现.                paramTypes[0= typeof(string);
 68[CommunityServer]自定义扩展Provider的实现.                paramTypes[1= typeof(string);
 69[CommunityServer]自定义扩展Provider的实现.
 70[CommunityServer]自定义扩展Provider的实现.                providerCnstr = type.GetConstructor(paramTypes);
 71[CommunityServer]自定义扩展Provider的实现.
 72[CommunityServer]自定义扩展Provider的实现.            }
 
 73[CommunityServer]自定义扩展Provider的实现.            catch 
 74[CommunityServer]自定义扩展Provider的实现.            {
 75[CommunityServer]自定义扩展Provider的实现.                ProviderException(dataProvider.Name);
 76[CommunityServer]自定义扩展Provider的实现.            }

 77[CommunityServer]自定义扩展Provider的实现.
 78[CommunityServer]自定义扩展Provider的实现.           if(providerCnstr == null)
 79[CommunityServer]自定义扩展Provider的实现.               ProviderException(dataProvider.Name);
 80[CommunityServer]自定义扩展Provider的实现.
 81[CommunityServer]自定义扩展Provider的实现.            return providerCnstr;
 82[CommunityServer]自定义扩展Provider的实现.        }

 83[CommunityServer]自定义扩展Provider的实现.
 84[CommunityServer]自定义扩展Provider的实现.        /// <summary>
 85[CommunityServer]自定义扩展Provider的实现.        /// Creates an instance of the specified provider using the Cached
 86[CommunityServer]自定义扩展Provider的实现.        /// ConstructorInfo from CreateConstructorInfo
 87[CommunityServer]自定义扩展Provider的实现.        /// </summary>

 88[CommunityServer]自定义扩展Provider的实现.        public static object Invoke(Provider dataProvider)
 89[CommunityServer]自定义扩展Provider的实现.        {
 90[CommunityServer]自定义扩展Provider的实现.            object[] paramArray = new object[2];
 91[CommunityServer]自定义扩展Provider的实现.
 92[CommunityServer]自定义扩展Provider的实现.            
 93[CommunityServer]自定义扩展Provider的实现.            string dbOwner = null
 94[CommunityServer]自定义扩展Provider的实现.            string connstring = null;
 95[CommunityServer]自定义扩展Provider的实现.
 96[CommunityServer]自定义扩展Provider的实现.            GetDataStoreParameters(dataProvider, out connstring, out dbOwner);
 97[CommunityServer]自定义扩展Provider的实现.
 98[CommunityServer]自定义扩展Provider的实现.            paramArray[0= dbOwner;
 99[CommunityServer]自定义扩展Provider的实现.            paramArray[1= connstring;
100[CommunityServer]自定义扩展Provider的实现.
101[CommunityServer]自定义扩展Provider的实现.            return CreateConstructorInfo(dataProvider).Invoke(paramArray);
102[CommunityServer]自定义扩展Provider的实现.        }

103[CommunityServer]自定义扩展Provider的实现.
104[CommunityServer]自定义扩展Provider的实现.        Exception

  通过Type.GetType()来进行类的反射,当然我们需要对其进行实例化才能调用abstract class中的方法和属性,这就要用到Activator.CreateInstance(type,new object[]{databaseOwner,connectionString}),这个方法对类进行了实例化,当然实例化这个类的构造函数中的参数为(databaseOwner,connectionString);当查找到这个构造函数进行实例化时也将DataProvider中所得到的databaseOwner,connectionString两个变量的值传递给了参数。


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