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 ...
随机推荐
- UVA 12436 - Rip Van Winkle's Code(线段树)
UVA 12436 - Rip Van Winkle's Code option=com_onlinejudge&Itemid=8&page=show_problem&cate ...
- 数据库数据格式化之Kettle Spoon
前言 现在的数据库种类越来越多,数据库备份的格式也越来越复杂,所以数据格式化一直是一个老生常谈的问题.据库备份文件格式那么多,既有SQL的,也有BAK的,还有TXT的等.数据库种类也有很多,MySQL ...
- systemtap 脚本示例
.[root@localhost ~]# stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}' Pass ...
- mysql exists 如何使用
还没时间看,exists用的少 ==>当你只需要判断后面的查询结果是否存 在时使用exists() http://edu.codepub.com/2011/0208/29218.php 今天正 ...
- Android 之窗口小部件高级篇--App Widget 之 RemoteViews
Android 之窗口小部件高级篇--App Widget 之 RemoteViews 在之前的一篇博文(Android 之窗口小部件详解--App Widget)中,已经介绍了App Widget的 ...
- Linux下Tomcat的启动、关闭
在Linux系统下,启动和关闭Tomcat使用命令操作. 进入Tomcat下的bin目录 1 cd /java/tomcat/bin 启动Tomcat命令 1 ./startup.sh 停止Tomca ...
- Java反射-修改String常量
/* * ReflectString.java * Version 1.0.0 * Created on 2017年12月15日 * Copyright ReYo.Cn */ package reyo ...
- Tomcat启动log打印到INFO: At least one JAR was scanned for TLDs yet contained no TLD各种解决方式
问题: 启动tomcat时,catalina.out日志打印到如下内容就停止不动了,也不报错 SEVERE: FarmWarDeployer can only work as host cluster ...
- springMVC中HTTP PUT请求该如何传输请求参数呢?
对于表单提交,tomcat默认只解析POST的表单,对于PUT和DELETE的不处理,所以Spring拿不到.解决方案:1.修改tomcat的server.xml: <Connector p ...
- MongoDB索引,性能分析
索引的限制: 索引名称不能超过128个字符 每个集合不能超过64个索引 复合索引不能超过31列 MongoDB 索引语法 db.collection.createIndex({ <field&g ...