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 ...
随机推荐
- java 虚拟机启动参数 (转)
在Java.J2EE大型应用中,JVM非标准参数的配置直接关系到整个系统的性能. JVM非标准参数指的是JVM底层的一些配置参数,这些参数在一般开发中默认即可,不需要任何配置.但是在生产环境中,为了提 ...
- CRC32 Source Code
/* The Quest Operating System * Copyright (C) 2005-2010 Richard West, Boston University * * This pro ...
- redis详解(三)-- 面试题
1. 使用Redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,li ...
- 使用Brackets
Brackets功能还是很强大的. 官网:brackets.io常见问题解决:https://github.com/adobe/brackets/wiki/Troubleshooting快捷键:htt ...
- Java 数组的 12 个最佳方法
1. 声明一个数组 String[] aArray = new String[5]; String[] bArray = {"a","b","c&q ...
- 【pycharm】pycharm上安装tensorflow,报错:AttributeError: module 'pip' has no attribute 'main' 解决方法
pycharm上安装tensorflow,报错:AttributeError: module 'pip' has no attribute 'main' 解决方法 解决方法: 在pycharm的安装目 ...
- React中的的JSX
什么是JSX? JSX是JavaScript XML的缩写,其本质是js,表现形式类似于XML,与js区别在于可直接在里面编写html标签. 怎么使用JSX? 语法规则: JSX 的基本语法规则:HT ...
- libjpeg的问题
游戏项目是基于cocos2d-x开发的,但线上发现一个bug就是玩家在设置完自定义头像后直接闪退.凡是在设置该玩家头像的地方,游戏就直接闪退.最终定位到的问题是图片数据源有问题,我的机器是win7,图 ...
- 深入理解ClassLoader工作机制(jdk1.8)
ClassLoader 顾名思义就是类加载器,ClassLoader 作用: 负责将 Class 加载到 JVM 中 审查每个类由谁加载(父优先的等级加载机制) 将 Class 字节码重新 ...
- attrs.xml中declare-styleable 详解(用于自定义控件的属性)
1. 框架定义: <declare-styleable name = "名称"> <attr name = "……" format = &qu ...