单例模式是是常用经典十几种设计模式中最简单的。.NET中单例模式的实现也有很多种方式。下面我来介绍一下NopCommerce中单例模式实现。

我之前的文章就分析了一下nop中EngineContext的实现。EngineContext是把一个Web请求用Nop的EngineContext引擎上下文封装。里面提供了一个IEngine的单例对象的访问方式。

下面就是EngineContext的源码:

一、EngineContext

 using System.Configuration;

 using System.Runtime.CompilerServices;

 using Nop.Core.Configuration;

 namespace Nop.Core.Infrastructure

 {

     /// <summary>

     ///Provides access to the singleton instance of the Nop engine.

     ///提供了访问单例实例Nop引擎

     /// </summary>

     public class EngineContext

     {

         #region Methods

         /// <summary>

         /// Initializes a static instance of the Nop factory.

         /// 初始化静态Nop工厂的实例

         /// </summary>

         /// <param name="forceRecreate">创建一个新工厂实例,尽管工厂已经被初始化</param>

         [MethodImpl(MethodImplOptions.Synchronized)]

         public static IEngine Initialize(bool forceRecreate)

         {

             if (Singleton<IEngine>.Instance == null || forceRecreate)

             {

                 Singleton<IEngine>.Instance = new NopEngine();

                 var config = ConfigurationManager.GetSection("NopConfig") as NopConfig;

                 Singleton<IEngine>.Instance.Initialize(config);

             }

             return Singleton<IEngine>.Instance;

         }

         /// <summary>

         /// Sets the static engine instance to the supplied engine. Use this method to supply your own engine implementation.

         /// 设置静态引擎实例提供的引擎,

         /// </summary>

         /// <param name="engine">The engine to use.</param>

         /// <remarks>Only use this method if you know what you're doing.</remarks>

         public static void Replace(IEngine engine)

         {

             Singleton<IEngine>.Instance = engine;

         }

         #endregion

         #region Properties

         /// <summary>

         /// Gets the singleton Nop engine used to access Nop services.

         /// </summary>

         public static IEngine Current

         {

             get

             {

                 if (Singleton<IEngine>.Instance == null)

                 {

                     Initialize(false);

                 }

                 return Singleton<IEngine>.Instance;

             }

         }

         #endregion

     }

 }

上面Initialize方法使用[MethodImpl(MethodImplOptions.Synchronized)]声明,就保证只能有一个线程访问,因为.NET的Web程序无论是WebForm还是mvc都在服务端都是多线程的。这样就标记只能有一个线程调用Initialize方法,也就保证了实例对象IEngine的在内存中只有一份。然后把单例实例对象的存储到类Singleton中。Singleton就像是一个对象容器,可以把许多单例实例对象存储在里面。

下面我们来看看实例Singleton的实现思路。

二、Singleton

 using System;

 using System.Collections.Generic;

 namespace Nop.Core.Infrastructure

 {

     /// <summary>

     /// A statically compiled "singleton" used to store objects throughout the

     /// lifetime of the app domain. Not so much singleton in the pattern's

     /// sense of the word as a standardized way to store single instances.

     /// </summary>

     /// <typeparam name="T">The type of object to store.</typeparam>

     /// <remarks>Access to the instance is not synchrnoized.</remarks>

     public class Singleton<T> : Singleton

     {

         static T instance;

         /// <summary>The singleton instance for the specified type T. Only one instance (at the time) of this object for each type of T.</summary>

         public static T Instance

         {

             get { return instance; }

             set

             {

                 instance = value;

                 AllSingletons[typeof(T)] = value;

             }

         }

     }

     /// <summary>

     /// Provides a singleton list for a certain type.

     /// </summary>

     /// <typeparam name="T">The type of list to store.</typeparam>

     public class SingletonList<T> : Singleton<IList<T>>

     {

         static SingletonList()

         {

             Singleton<IList<T>>.Instance = new List<T>();

         }

         /// <summary>The singleton instance for the specified type T. Only one instance (at the time) of this list for each type of T.</summary>

         public new static IList<T> Instance

         {

             get { return Singleton<IList<T>>.Instance; }

         }

     }

     /// <summary>

     /// Provides a singleton dictionary for a certain key and vlaue type.

     /// </summary>

     /// <typeparam name="TKey">The type of key.</typeparam>

     /// <typeparam name="TValue">The type of value.</typeparam>

     public class SingletonDictionary<TKey, TValue> : Singleton<IDictionary<TKey, TValue>>

     {

         static SingletonDictionary()

         {

             Singleton<Dictionary<TKey, TValue>>.Instance = new Dictionary<TKey, TValue>();

         }

         /// <summary>The singleton instance for the specified type T. Only one instance (at the time) of this dictionary for each type of T.</summary>

         public new static IDictionary<TKey, TValue> Instance

         {

             get { return Singleton<Dictionary<TKey, TValue>>.Instance; }

         }

     }

     /// <summary>

     /// Provides access to all "singletons" stored by <see cref="Singleton{T}"/>.

     /// </summary>

     public class Singleton

     {

         static Singleton()

         {

             allSingletons = new Dictionary<Type, object>();

         }

         static readonly IDictionary<Type, object> allSingletons;

         /// <summary>Dictionary of type to singleton instances.</summary>

         public static IDictionary<Type, object> AllSingletons

         {

             get { return allSingletons; }

         }

     }

 }

Singleton类里面用一个Dictionary<Type, object>()集合来存储所有的单例对象。基于Singleton类创建一些泛型类Singleton<T>,Singleton<IList<T>>,SingletonList<T>,Singleton<IDictionary<TKey, TValue>>和SingletonDictionary<TKey, TValue>。

【NopCommerce源码架构学习-二】单例模式实现代码分析的更多相关文章

  1. 【NopCommerce源码架构学习-一】--初识高性能的开源商城系统cms

    很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...

  2. NopCommerce源码架构

    我们承接以下nop相关的业务,欢迎联系我们. 我们承接NopCommerce定制个性化开发: Nopcommerce二次开发 Nopcommerce主题开发 基于Nopcommerce的二次开发的电子 ...

  3. NopCommerce源码架构详解--初识高性能的开源商城系统cms

    很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...

  4. NopCommerce源码架构详解

    NopCommerce源码架构详解--初识高性能的开源商城系统cms   很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从 ...

  5. Nop--NopCommerce源码架构详解专题目录

    最近在研究外国优秀的ASP.NET mvc电子商务网站系统NopCommerce源码架构.这个系统无论是代码组织结构.思想及分层都值得我们学习.对于没有一定开发经验的人要完全搞懂这个源码还是有一定的难 ...

  6. vnpy源码阅读学习(1):准备工作

    vnpy源码阅读学习 目标 通过阅读vnpy,学习量化交易系统的一些设计思路和理念. 通过阅读vnpy学习python项目开发的一些技巧和范式 通过vnpy的设计,可以用python复现一个小型简单的 ...

  7. 如何快速为团队打造自己的组件库(上)—— Element 源码架构

    文章已收录到 github,欢迎 Watch 和 Star. 简介 详细讲解了 ElementUI 的源码架构,为下一步基于 ElementUI 打造团队自己的组件库打好坚实的基础. 如何快速为团队打 ...

  8. 【原】AFNetworking源码阅读(二)

    [原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...

  9. 【原】SDWebImage源码阅读(二)

    [原]SDWebImage源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 解决上一篇遗留的坑 上一篇中对sd_setImageWithURL函数简单分析了一下,还 ...

随机推荐

  1. 全新 Mac 安装指南(编程篇)(环境变量、Shell 终端、SSH 远程连接)

    注:本文专门用于指导对计算机编程与设计(尤其是互联网产品开发与设计)感兴趣的 Mac 新用户,如何在 Mac OS X 系统上配置开发与上网环境,另有<全新 Mac 安装指南(通用篇)>作 ...

  2. 图片拾取器-PicPicker

    最近报名参加了360前端星计划,想当一名前端实习生,学习更多更流行的前端知识.然后需要完成一个作业,才能进培训,进了培训还得看运气才能留下,流程不少.书归正传,请看: 课后作业题目 请从下面两个题目中 ...

  3. 你get了无数技能,为什么一事无成

      前几日看到阮一峰老师的发的一句话,颇有感慨,「你只是坐在电脑前,往网上发表了一段文字或者一张图片,随便什么,就能够接触到多少陌生的灵魂.这就是我热爱互联网的原因」.我打心底认为这是一个最好的时代, ...

  4. 新人入职100天,聊聊自己的经验&教训

    这篇文章讲了什么? 如题,本屌入职100天之后的经验和教训,具体包含: 对开发的一点感悟. 对如何提问的一点见解. 对Google开发流程的吐槽. 如果你 打算去国外工作. 对Google的开发流程感 ...

  5. Hadoop 裡的 fsck 指令

    Hadoop 裡的 fsck 指令,可檢查 HDFS 裡的檔案 (file),是否有 corrupt (毀損) 或資料遺失,並產生 HDFS 檔案系統的整體健康報告.報告內容,包括:Total blo ...

  6. EMC学习之电磁辐射

    我们在接触新鲜事物的时候,通常习惯用自己熟悉的知识去解释自己不熟悉的事物.EMC知识更多的涉及到微波和射频,对于像我这种专注于信号完整性而 对EMC知识知之甚少的菜鸟来说,最初也只能用SI的一些基础知 ...

  7. iOS-常见问题

    11.21常见问题 一storyboard连线问题 产生原因:将与storyboard关联的属性删除了,但是storyboard中还保持之前所关联的属性. 解决: 点击view controller ...

  8. JSON-fastjson

    fastjson 是alibaba的一个Json处理工具包. 1.使用  JSON.toJSONString   和  JSON.parseObject fastjson只需要掌握两个静态方法:JSO ...

  9. webBrowser 加载网页

    事件 webBrowser_DocumentCompleted private void webBrowser_DocumentCompleted(object sender, WebBrowserD ...

  10. 前端学PHP之面向对象系列第四篇——关键字

    × 目录 [1]public [2]protected [3]private[4]final[5]static[6]const[7]this[8]self[9]parent 前面的话 php实现面向对 ...