BlogEngine.netProvider(策略模式)

其实了解了下BusinessBase这个业务对象类后,我还是大脑一片空白,内功不够啊。先不管,看看BlogEngine.net是怎么处理数据的。
Provider模式,其实就是策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
回过头来,看看BlogEngine.net是怎么实现的

看上面类图,实现了2个Provider类一个操作XML,一个操作数据库,应对策略模式的定义,就是分别封装起来的算法,可以互相替换。
那是怎么样独立于使用算法的客户的呢?

BlogEngine.net定义了个静态类,用来客户端使用,其中有个LoadProviders的方法用来加载provider(xml.. or db..)

LoadProviders
 1  ///<summary>
2 /// Load the providers from the web.config.
3 ///</summary>
4 private static void LoadProviders()
5 {
6 // Avoid claiming lock if providers are already loaded
7 if (_provider == null)
8 {
9 lock (TheLock)
10 {
11 // Do this again to make sure _provider is still null
12 if (_provider == null)
13 {
14 // Get a reference to the <blogProvider> section
15 var section = (BlogProviderSection)WebConfigurationManager.GetSection("BlogEngine/blogProvider");
16
17 // Load registered providers and point _provider
18 // to the default provider
19 _providers = new BlogProviderCollection();
20 ProvidersHelper.InstantiateProviders(section.Providers, _providers, typeof(BlogProvider));
21 _provider = _providers[section.DefaultProvider];
22
23 if (_provider == null)
24 {
25 throw new ProviderException("Unable to load default BlogProvider");
26 }
27 }
28 }
29 }
30 }
blogProvider
<BlogEngine>
<blogProvider defaultProvider="XmlBlogProvider">
<providers>
<add name="XmlBlogProvider" type="BlogEngine.Core.Providers.XmlBlogProvider, BlogEngine.Core"/>
<add name="DbBlogProvider" type="BlogEngine.Core.Providers.DbBlogProvider, BlogEngine.Core" connectionStringName="BlogEngine"/>
</providers>
</blogProvider>
</BlogEngine>


可以看到是读取配置文件进行加载的。
好了,现在我们知道客户端无须知道BlogService里的Provider是XmlBlogProvider还是DbBlogProvider,我们只须调用他的方法进行CRUD。等到以后要换数据源了,
那就新增个XXXBlogProvider然后配置文件修改下,完全不需要通知客户端代码。

原文地址:https://www.cnblogs.com/whosedream/p/2252311.html