• 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然后配置文件修改下,完全不需要通知客户端代码。

  • 相关阅读:
    [C++] Class (part 2)
    [C++] Class (part 1)
    [c++] Inline Function
    [C++] in-class initializer
    简易线程池Thread Pool
    js里function的apply vs. bind vs. call
    webix custom component-九宫格
    webix源码阅读
    比特币的原理+问题
    wpf中UserControl的几种绑定方式
  • 原文地址:https://www.cnblogs.com/whosedream/p/2252311.html
Copyright © 2020-2023  润新知