zoukankan      html  css  js  c++  java
  • Provider Pattern for Beginners in .net


    Download ProviderPattern.zip

    Introduction

    Provider pattern allows the developers to create pluggable components. It was first introduced in framework 2.0 and it has lot of features like "Membership Provider", "Roles Provider" etc. and instantiates using configuration file.

    This article provides guidelines to create logging component using provider pattern. The sample project contains two providers "TextLogProvider" and "XmlLogProvider" You can set one of them default in configuration file.

    Base Data Provider Class

    First of all you need to define abstract representation of all your methods. Create your data provider base class and your class must inherit from System.Configuration.Provider.ProviderBase base class.

    Hide   Copy Code

    public
    						abstract
    								class LogProviderBase : ProviderBase
    

    {
    

       .
    

    
    					public
    							abstract
    									void WriteLog(LogType logType, string message);
    

       .
    

    }
    

    As you see LogProviderBase is an abstract class and it has abstract method WriteLog(..). In this example we have only one abstract method. But we can have more than one as per requirement.

    Data Provider Class

    After creating your base provider class, now you can create your concrete provider classes. In this sample I will create two providers for logging one for text and second for xml. Derive concrete provider class from LogProviderBase class and implement the abstract methods.

    Hide   Shrink    Copy Code

    public
    						class TextLogProvider : LogProviderBase
    

    {
    

     

    
    					#region Data Members
    

     

    
    					private
    							string _filePath = "";
    

     

    
    					#endregion
    

     

    
    					#region Overrided Methods
    

     

    
    					public
    							override
    									void SetParameters(System.Collections.Specialized.NameValueCollection config)
    

       {
    

           _filePath = config["fileLocation"];
    

       }
    

     

    
    					public
    							override
    									void WriteLog(LogType logType, string message)
    

       {
    

    
    					var dir = Path.GetDirectoryName(_filePath);
    

    
    					if (!Directory.Exists(dir))
    

               Directory.CreateDirectory(dir);
    

     

    
    					using (var sw = new StreamWriter(_filePath, true))
    

           {
    

    
    					string s = string.Format("{0}, {1}, {2}", DateTime.Now, logType.ToString(), message);
    

               sw.WriteLine(s);
    

           }
    

       }
    

     

    
    					#endregion
    

     

    }
    

    Write the logging logic according to your provider type by implementing WriteLog(…). In TextLogProviderclass i am saving CVS line in text file.

    Provider Collection & Configuration Section

    For taking care of the provider configuration, you must write your own provider collection class derived from System.Configuration.ProviderCollection class. ProviderCollection class exposes properties and methods to work with the list of various data providers declared in your configuration file.

    Hide   Copy Code

    public
    						class LogProviderCollection : ProviderCollection
    

    {
    

    
    					new
    							public LogProviderBase this[string name]
    

       {
    

    
    					get { return (LogProviderBase)base[name]; }
    

       }
    

    }
    

    Provider pattern reads the concrete providers from the configuration file, for this purpose you need one more class which will read all the provider collections from the configuration file. Create ProviderConfiguration class derived from the System.Configuration.ConfigurationSection file.

    Hide   Copy Code

    public
    						class LogProviderConfiguration : ConfigurationSection
    

    {
    

     

       [ConfigurationProperty("providers")]
    

    
    					public ProviderSettingsCollection Providers
    

       {
    

    
    					get
    						

           {
    

    
    					return (ProviderSettingsCollection)base["providers"];
    

           }
    

       }
    

     

       [ConfigurationProperty("default", DefaultValue = "XmlProvider")]
    

    
    					public
    							string DefaultProviderName
    

       {
    

    
    					get
    						

           {
    

    
    					return
    							base["default"] as
    													string;
    

           }
    

       }
    

     

    }
    

    In this class you can add as many properties based on the different parameters that you need to extract from the configuration sections. All the properties must be decorated with the ConfigurationProperty attribute.

    Configuration

    For configuring the provider model, we need to define our provider configuration section in <configsections>. Here we can add a <section> element with the name of the provider model configuration section element and the type of our data provider configuration class.

    After configuring section (we configured LogProviders as section name). Now we need to add our all available providers in it and set one default provider from them.

    Hide   Copy Code

    <configSections>
    							

    
    					<section
    								name="LogProviders"
    										

    
    					type="ProviderPatternLogTest.LogProvider.LogProviderConfiguration, ProviderPatternLogTest"/>
    							

    </configSections>
    							

     

     

    <LogProviders
    							default="XmlProvider">
    									

    
    					<providers>
    								

     

    
    					<add
    								name="XmlProvider"
    										

    
    					type="ProviderPatternLogTest.LogProvider.Providers.XmlLogProvider, ProviderPatternLogTest"
    							

    
    					fileLocation="c:	emplog.xml"/>
    							

     

    
    					<add
    								name="TextProvider"
    										

    
    					type="ProviderPatternLogTest.LogProvider.Providers.TextLogProvider, ProviderPatternLogTest"
    							

    
    					fileLocation="c:	emplog.txt"/>
    							

     

    
    					</providers>
    								

    </LogProviders>
    							

    Use Provider Model in Code

    It is very easy to use provider model in your code, simply get the default property of Provider Manager Class and then call your concrete methods

    Hide   Copy Code

    LogProviderManager.Default.WriteLog(logType, txtMessage.Text);
    

    Get Other Information

    You can also easily get other useful information of your concrete provider. Simply get ProviderSetting using LogProviderManager.

    Hide   Copy Code

    var setting = LogProviderManager.ProviderSettings[defaultName];
    

     

    var setStr = GetSetting(setting);
    

     

    MessageBox.Show(setStr);
    

    GetSetting(...) method only parse all the parameters and returns concatenated string message.

    Hide   Copy Code

    private
    						string GetSetting(ProviderSettings setting)
    

    {
    

       StringBuilder str = new StringBuilder();
    

       str.AppendLine(string.Format("Default Provider name: {0}", setting.Name));
    

       str.AppendLine(string.Format("Default Provider type: {0}", setting.Type));
    

       str.AppendLine("------------------Parameters--------------------");
    

    
    					foreach (String s in setting.Parameters)
    

       {
    

     

           str.AppendLine(string.Format("Parameter: {0} -> {1}", s, setting.Parameters.Get(s)));
    

       }
    

       str.AppendLine("---------------------------------------");
    

       str.AppendLine("");
    

     

    
    					return str.ToString();
    

    }
    

     

    From: https://www.codeproject.com/Articles/550495/Provider-Pattern-for-Beginners

  • 相关阅读:
    将model注册进单例中,每次用的时候从单例里面取
    构建ASP.NET MVC4&JQuery&AJax&JSon示例
    ajax用法
    MVC 后台向前台传值,同一Controller下Action之间的传值,Controller与Controller之间的传值
    mvc5入门指南
    在EF中做数据索引
    json to Object
    ajax请求后返回的时间转换格式
    Target JRE version (1.8.0_101) does not match project JDK version (unknown), will use sources from JDK: 1.8
    Idea 配置启动JDK___在windows中使用Intellij Idea时选择自定义的64位JVM
  • 原文地址:https://www.cnblogs.com/time-is-life/p/6349250.html
Copyright © 2011-2022 走看看