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:\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的更多相关文章

  1. 二十四种设计模式:提供者模式(Provider Pattern)

    提供者模式(Provider Pattern) 介绍为一个API进行定义和实现的分离.示例有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库 ...

  2. Provider Pattern提供者模式和策略模式

    http://www.codeproject.com/Articles/18222/Provider-Pattern Introduction Provider pattern is one of t ...

  3. 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

    原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 提供者模式(Provider Pattern) 作者:weba ...

  4. 打造属于你的提供者(Provider = Strategy + Factory Method) 设计模式 - Provider Pattern(提供者模式)

    打造属于你的提供者(Provider = Strategy + Factory Method)   1.1.1 摘要 在日常系统设计中,我们也许听说过提供者模式,甚至几乎每天都在使用它,在.NET F ...

  5. Membership三步曲之进阶篇 - 深入剖析Provider Model

    Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...

  6. 深入剖析Provider Model

    Membership三步曲之进阶篇 - 深入剖析Provider Model Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provide ...

  7. [React] Implement a React Context Provider

    If you have state that needs to exist throughout your application, then you may find yourself passin ...

  8. Code Project精彩系列(转)

    Code Project精彩系列(转)   Code Project精彩系列(转)   Applications Crafting a C# forms Editor From scratch htt ...

  9. 抽象工厂在ADO.Net中的应用

    https://msdn.microsoft.com/zh-cn/library/ms971499.aspx http://www.c-sharpcorner.com/UploadFile/moses ...

随机推荐

  1. ISO 7816-4: Annex A: Transportation of APDU messages by T=0

    http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4_annex-a.aspx Annex A: Transportation ...

  2. go标准库DOC与 raft

    http://studygolang.com/static/pkgdoc/index.html https://github.com/avelino/awesome-go#database

  3. PHP开启curl_init

    windows主机出现“Call to undefined function curl_init”错误提示,没有定义的函数,也就是php还没打开对curl_init函数的支持. 全文:http://j ...

  4. .Net Discovery系列之十二-深入理解平台机制与性能影响(下)

    上一篇文章中Aicken为大家介绍了.Net平台的垃圾回收机制.即时编译机制与其对性能的影响,这一篇中将继续为大家介绍.Net平台的异常捕获机制与字符串驻留机制. 三.关于异常捕获机制 虽然我们已经很 ...

  5. excel 单元格内容太多,替换有问题

    excel 单元格内容太多,替换有问题

  6. c++ 实现atoi()函数

    1. 问题描写叙述 实现c++函数库中atoi()函数,要考虑到各种特殊情况: 空字符串. +和-号. 字符串前中后n个空格. 溢出. 非数字字符. 2. 解决方式 转换过程并不复杂.复杂的是要考虑到 ...

  7. 法外之徒第一季/全集Braquo迅雷下载

    英文译名 Braquo (第1-2季) (2012-01-05首播)法国.本季看点:<法外之徒>Eddy.Théo.Walter和Roxane私人本是巴黎上塞纳省地区的警察. 因为他们的好 ...

  8. Leetcode刷题记录:构建最大数二叉树

    题目要求,题目地址 给定一个不含重复数字的数组,最大二叉树构建规则如下: 1.根是数组中最大的数字 2.左边的子树是最大数字左边的内容 3.右边的子树是最大数字右边的内容 答案 class Solut ...

  9. 相关性系数及其python实现

    参考文献: 1.python 皮尔森相关系数 https://www.cnblogs.com/lxnz/p/7098954.html 2.统计学之三大相关性系数(pearson.spearman.ke ...

  10. Jackcess 1.2.13 发布,Java 访问 Access 数据库

    Jackcess 1.2.13 包含新的方法用于在数据库和附件内容解码中查找复杂值类型的关系,修复了 CodeHandler 相关的一些小 bug. Jackcess 是一个Java 类库,用来读写微 ...