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

  • 相关阅读:
    input file上传文件弹出框的默认格式设置
    sql server中raiserror的用法(动态参数传值)
    Vue 安装“npm install -g @vue/cli”发生npm WARN deprecated request@2.88.2: request has been deprecated,的错误解决方法
    jquery奇数、偶数选择器
    使用float时造成里层的div无法撑开外层的div的解决办法
    Vue监听到被赋值后执行某个动作
    使用Jquery的$.unique去重时,注意先排序再去重
    DbFunctions.DiffDays(DateTime? dateValue1, DateTime? dateValue2)说明
    jquery利用sort方法对json数据排序
    jQuery closest() /parents()/parent() 方法说明
  • 原文地址:https://www.cnblogs.com/whosedream/p/2252311.html
Copyright © 2011-2022 走看看