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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架