Provider Pattern for Beginners in .net
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:\temp\log.xml"/>
<add
name="TextProvider"
type="ProviderPatternLogTest.LogProvider.Providers.TextLogProvider, ProviderPatternLogTest"
fileLocation="c:\temp\log.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
Provider Pattern for Beginners in .net的更多相关文章
- 二十四种设计模式:提供者模式(Provider Pattern)
提供者模式(Provider Pattern) 介绍为一个API进行定义和实现的分离.示例有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库 ...
- Provider Pattern提供者模式和策略模式
http://www.codeproject.com/Articles/18222/Provider-Pattern Introduction Provider pattern is one of t ...
- 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)
原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 提供者模式(Provider Pattern) 作者:weba ...
- 打造属于你的提供者(Provider = Strategy + Factory Method) 设计模式 - Provider Pattern(提供者模式)
打造属于你的提供者(Provider = Strategy + Factory Method) 1.1.1 摘要 在日常系统设计中,我们也许听说过提供者模式,甚至几乎每天都在使用它,在.NET F ...
- Membership三步曲之进阶篇 - 深入剖析Provider Model
Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...
- 深入剖析Provider Model
Membership三步曲之进阶篇 - 深入剖析Provider Model Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provide ...
- [React] Implement a React Context Provider
If you have state that needs to exist throughout your application, then you may find yourself passin ...
- Code Project精彩系列(转)
Code Project精彩系列(转) Code Project精彩系列(转) Applications Crafting a C# forms Editor From scratch htt ...
- 抽象工厂在ADO.Net中的应用
https://msdn.microsoft.com/zh-cn/library/ms971499.aspx http://www.c-sharpcorner.com/UploadFile/moses ...
随机推荐
- SAE J1850 VPW Implement
---恢复内容开始--- OBDII Interface Project When I can ever find enough time away from schoolwork, I try to ...
- Android adb logcat使用技巧
前言 新买的笔记本E431装了最新版的Eclipse,搞定了Android开发环境,可是logcat里查看东西居然仅仅显示level,没有错误的具体信息.我本身也不是一个愿意折腾图形界面,更喜欢纯命令 ...
- Unity3D实践系列04, 脚本的生命周期
Unity3D脚本生命周期是指从脚本的最初唤醒到脚本最终销毁的整个过程.生命周期的各个方法被封装到了MonoBehaviour类中.具体来说如下: 1.In Editor Mode 编辑模式 当在编辑 ...
- 布局控件Grid
XAML概述 Silverlight的控件绘制是由XAML语言进行支持的.什么是XAML语言? 简单的说,XAML(Extensible Application Markup Language )是一 ...
- Linux安装ImageMagick与JMagick完成过程及配置
原文地址:http://www.iitshare.com/linux-install-imagemagick-jmagick.html 一.安装背景 最近在服务器上部署了HapiCMS的产品,因为其对 ...
- ios 判断app程序第一次启动方法
if(![[NSUserDefaults standardUserDefaults] boolForKey:@"firstStart"]){ [[NSUserDefaults st ...
- ios测试宏指令出错:“Expected identefier”
写了一个简单的测试宏指令,然后在下面代码中报错,不知道怎么修复?谢谢 #define test(condition) do{\ if (condition) {\ //// <-----Expe ...
- 删除 AP 发票相关脚本
/* Formatted on 2018/3/15 10:33:14 (QP5 v5.256.13226.35538) */ --发票 CREATE TABLE bak.ap_invoices_all ...
- how to use kvo with swift (怎样在swift中使用kvo)
- 初识安卓小程序(Android电话拨号器)
首先,先创建一个安卓项目(我的版本号是4.4.2的),名字为"电话拨号器",创建的时候点击"clipart",如图: 然后在res目录下找到layout目录,找 ...
