http://www.codeproject.com/Articles/18222/Provider-Pattern

Introduction

Provider pattern is one of the most interesting features that Microsoft introduced in .NET 2.

提供者模式,是微软在.net2.0中介绍的最有趣的功能。
A lot of features including membership providers, roles providers, profile providers, health monitor event providers, site map providers, and more had the same design concept. These features are not changeable but extendable, and that is the beauty of the provider pattern.

许多功能有相同的设计概念,比如membership providers, roles providers, profile providers, health monitor event providers, site map providers等等。这些功能虽然是不变的,但是是可以扩展的,这就是提供者模式的优雅之处。

In this article, I will demonstrate the concept of provider pattern itself, and how easy it is to create your own services designed by provider pattern, and make your services extendable and reusable.

在这篇文章中,我将展示提供者模式的概念,并展示如何通过提供者模式实现你自己的服务,让你的服务变得可扩展和重用

Provider Pattern in More Detail

It is not a brand new idea; it came basically from the popular strategy pattern. It is a good idea to have a quick look at the strategy pattern in here.

提供者模式并非一个全新的主意,它主要从流行的策略模式发展而来。快速浏览下策略模式是个不错的想法。

I see the strategy pattern as a changeable algorithm depending on different situations or different context. This algorithm is encapsulated in object, this object implements an interface or inherits from an abstracted class.

我认为的策略模式是一种根据不同的情况或环境,可以改变算法。算法被封装在对象中,对象实现了一个接口或者从抽象类继承。

For example, the Paintbrush saves the same picture in different formats, GIF, BMP,...

例如,画刷可以将同一张图片保存为多个不同的形式,Gif,Bmp格式等。

Or Microsoft Word saves the document in different formats, doc, rtf, txt,... In my work, we used strategy pattern very often.

再如微软的word文档,可以保存为多种形式,doc,rtf,txt……在的工作中,我们经常使用策略模式。

Maybe, we will come to the top of our design pattern list, one of the implementations that we used, we used in collection builder to build the same collection in different ways.

也许,我们来到了设计模式列表的顶端,我们使用的一种实现,在collection builder中我们使用不同的方式来创建同一个collection。

For example, Customers collection has the same methods and behavior in a certain context, once the context changes, all the behavior changes.

例如,Customers集合在一个确定的上下文中,有相同的方法和行为,一旦上下文变化了,所有的行为就都改变了。

We have AllCustomers context and InvoiceCustomer context,ProductCustomer context, and each of them has a different database, sometimes it is a simple table in database or 1-many or many-many relation tables in database.

我们有AllCustomers上下文以及InvoiceCustomer,ProductCustomer上下文,每一个都有一个不同的数据库。有时它只是数据库中的一张简单表或者1对多或多对多的关联表。

So we create one collection but with different behaviors. I developed an authentication module.

所以我们创建了一个有不同行为的集合。我开发了授权模块

This module is very complex, but after I applied a strategy pattern with composite pattern, it became very simple to maintain, or to extend.

这个模块是很复杂的,但是在我应用了复合模式的策略模式后,它变得简单可维护并且可扩展

The user object has a property called Role, and depending on the context the Role changes.

用户对象有一个叫做Role的属性,根据不同的上下文,属性会变化。

The strategy pattern is beyond the scope of this article, but it is worth studying and implementing this pattern.

策略模式超出了本文的范围,但是它值得学习并实现这个模式。

However, I still can see a few differences between strategy pattern and provider pattern.

然而,我始终可以发现策略模式和提供者模式之间的区别。

Strategy pattern is a Generic concept, not sticking to a specific technology or global scenarios, but provider pattern in most cases is a configurable service, provided by external source, that you can plug-in to your application, or you may extend this service to create your own custom service, then plug-in to your application.

策略模式是一个泛型的概念。没有和特定的技术或全局的情境绑定。但是提供者模式在大多数情况下是一个可配置的服务,由外部资源提供。你可以将它插入你的应用。或者你可以扩展服务来创建你自定义的服务,然后在插入到你的应用中。

The service provider should have the same features or contract, that is defined in the base class as contract, but with different behaviors, different formats or different connectivity like using web services, database(s) or XML files or streams.

服务提供者应该有相同的功能或者契约,这需要在基类中作为契约来定义,但是有不同的行为,形式,或连通度像web服务、数据库、或者xml文件或流。

Creating Your Own Provider

There are 3 major steps to create your own provider.  创建你自己的提供者,有3个主要步骤:

Step 1: Create Your ServiceBase

To create your own provider pattern, you must inherit your service fromSystem.Configuration.Provider.ProviderBase class:

为了创建你自己的提供者模式,你必须从System.Configuration.Provider.ProviderBase继承你自己的服务:

Step2: Create Your ServiceCollection

To define your own collection class, you should inherit fromSystem.Configuration.Provider.ProviderCollection.

为了定义你自己的集合类,你应该从System.Configuration.Provider.ProviderCollection继承。

Step 3: Implement First Concrete Provider

You should to implement at least one of the providers and test it carefully before releasing it in your own company library.

你应该至少实现一个提供者,并且在它发布到你公司的类库前,仔细的测试。

In the previous code, one of the most important codes is Initialize(…) method. You should retrieve the minimum information that should be in the configuration file.

在之前的代码中,最重要的代码是Initialize方法。你应该从配置文件中检索出所需的最小信息。

Step 3: Creating ProviderManger

Moreover, to simplify the pattern, create a static class ProviderManager that has two static properties;Provider (for default provider), and Providers (for other providers that are registered in application configuration), to simplify the access in runtime.

此外,为了简化模式,创建一个名为ProviderManager 的静态类,有2个静态属性:Provider 和Providers,确保在运行时可以方便的访问。

Provider 默认的provider

Providers给其他在应用程序中注册的providers

Provider Pattern提供者模式和策略模式的更多相关文章

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

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

  2. 大型Java进阶专题(七) 设计模式之委派模式与策略模式

    前言 ​ 今天开始我们专题的第七课了.本章节将介绍:你写的代码中是否觉得很臃肿,程序中有大量的if...else,想优化代码,精简程序逻辑,提升代码的可读性,这章节将介绍如何通过委派模式.策略模式让你 ...

  3. Android设计模式之命令模式、策略模式、模板方法模式

    命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从 ...

  4. 我学的是设计模式的视频教程——命令模式vs策略模式,唠嗑

    课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 版权声明:本文博主原创文章,博客,未经同意不得转载.

  5. 模式PK:命令模式VS策略模式

    1.概述 命令模式和策略模式的类图确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的意图是封装算法,它认为“算法”已经是一个 ...

  6. ES6对抽象工厂模式与策略模式结合的实践

    这段代码是我在学习了java版的抽象工厂模式后,实现的ES6版抽象工厂,后期大幅修改,加入了策略模式,看起来很多逻辑看似繁琐,不必要写这么多,但是为了练习设计模式,所以才这样做.当所需的工厂种类增多后 ...

  7. C++模式学习------策略模式

    当遇到同一个对象有不同的行为,方法,为管理这些方法可使用策略模式. 策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来.通常把一个系列的算法包装到一系列的策略类里面,这些类继承一个抽象的 ...

  8. 【设计模式】 模式PK:命令模式VS策略模式

    1.概述 命令模式和策略模式的类图确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的意图是封装算法,它认为“算法”已经是一个 ...

  9. 策略模式、策略模式与Spring的碰撞

    策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式. 实际案例 我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况: 如果A地-B地往返都 ...

随机推荐

  1. Regex.Match 方法

    Regex.Match 方法 在输入字符串中搜索正则表达式的匹配项,并将精确结果作为单个 Match 对象返回. 重载列表      (1) 在指定的输入字符串中搜索 Regex 构造函数中指定的正则 ...

  2. window对象的属性方法名造成的命名冲突

    事件起因: 一次开发中需要获取一个数组的长度,写下如此代码 function func(arr){ length = arr.length; ......//相关操作 } 程序在chrome下正常运行 ...

  3. 团队项目-smart原则

    Smart原则 Specific ——明确性 所谓明确就是要用具体的语言清楚地说明要达成的行为标准.明确的目标几乎是所有成功团队的一致特点.很多团队不成功的重要原因之一就因为目标定的模棱两可,或没有将 ...

  4. Notification用法

    String message = "You should click come back now. It is time out more than 10 minutes."; / ...

  5. git/github在windows上使用

    问题描述:     git在Windows上的使用 问题解决:     (1)下载安装git http://msysgit.github.io/ 到该网址中下载msgit软件 注:     安装msg ...

  6. VIM配置(转载)

    注: 转载于http://www.cnblogs.com/ma6174/ 花了很长时间整理的,感觉用起来很方便,共享一下. 我的vim配置主要有以下优点: 1.按F5可以直接编译并执行C.C++.ja ...

  7. ios开发小技巧之提示音播放与震动

    在ios开发中,有时候我们需要频繁播放某种提示声音,比如微博刷新提示音.QQ消息提示音等,对于这些短小且需要频繁播放的音频,最好将其加入到系统声音(system sound)里. 注意: 需要播放的音 ...

  8. 堆栈中的EIP EBP ESP

    EIP,EBP,ESP都是系统的寄存器,里面存的都是些地址.  为什么要说这三个指针,是因为我们系统中栈的实现上离不开他们三个.  我们DC上讲过栈的数据结构,主要有以下特点:  后进先处.(这个强调 ...

  9. uva 10910

    简单dp /************************************************************************* > Author: xlc2845 ...

  10. 为什么乱码:<meta http-equiv="content-type">前的非ANSI字符

    为什么乱码:<meta http-equiv="content-type">前的非ANSI字符 浏览器检测网页字符集的默认顺序 浏览器的网页字符集检测顺序通常是: ch ...