【NopCommerce源码架构学习-二】单例模式实现代码分析
单例模式是是常用经典十几种设计模式中最简单的。.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源码架构学习-二】单例模式实现代码分析的更多相关文章
- 【NopCommerce源码架构学习-一】--初识高性能的开源商城系统cms
		很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ... 
- NopCommerce源码架构
		我们承接以下nop相关的业务,欢迎联系我们. 我们承接NopCommerce定制个性化开发: Nopcommerce二次开发 Nopcommerce主题开发 基于Nopcommerce的二次开发的电子 ... 
- NopCommerce源码架构详解--初识高性能的开源商城系统cms
		很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ... 
- NopCommerce源码架构详解
		NopCommerce源码架构详解--初识高性能的开源商城系统cms 很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从 ... 
- Nop--NopCommerce源码架构详解专题目录
		最近在研究外国优秀的ASP.NET mvc电子商务网站系统NopCommerce源码架构.这个系统无论是代码组织结构.思想及分层都值得我们学习.对于没有一定开发经验的人要完全搞懂这个源码还是有一定的难 ... 
- vnpy源码阅读学习(1):准备工作
		vnpy源码阅读学习 目标 通过阅读vnpy,学习量化交易系统的一些设计思路和理念. 通过阅读vnpy学习python项目开发的一些技巧和范式 通过vnpy的设计,可以用python复现一个小型简单的 ... 
- 如何快速为团队打造自己的组件库(上)—— Element 源码架构
		文章已收录到 github,欢迎 Watch 和 Star. 简介 详细讲解了 ElementUI 的源码架构,为下一步基于 ElementUI 打造团队自己的组件库打好坚实的基础. 如何快速为团队打 ... 
- 【原】AFNetworking源码阅读(二)
		[原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ... 
- 【原】SDWebImage源码阅读(二)
		[原]SDWebImage源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 解决上一篇遗留的坑 上一篇中对sd_setImageWithURL函数简单分析了一下,还 ... 
随机推荐
- Kinect for Windows SDK开发学习相关资源
			Kinect for Windows SDK(K4W)将Kinect的体感操作带到了平常的应用学习中,提供了一种不同于传统的鼠标,键盘及触摸的无接触的交互方式,在某种程度上实现了自然交互界面的理想,即 ... 
- ASP.NET MVC Module
			ASP.NET MVC Module 前言 在ASP.NET中管道模型是怎么来实现的?在请求处理流程一文中大概的讲述了Http Module和HttpApplication之间的关系,而并没有涉及到H ... 
- android内部培训视频_第一节
			声明:本视频为公司内部做android培训时录制的,无任何商业目的.同时鉴于水平有限,可能不符合您的需求,放在这里的目的是提供给公司同事下载,作为培训的一个记录,也作为一个系列教程的自我督促完成的理由 ... 
- ArcGIS之Cartogram地图变形记
			一.地图会说谎 地图作为真实世界的抽象,是“用图说话”最可靠的工具,但是有的时候地图也会撒一些小小的谎言,其中最著名的例子当属美国总统大选.如图1是2012年美国总统大选后网上给出的一个结果图,红色代 ... 
- [大数据之Spark]——快速入门
			本篇文档是介绍如何快速使用spark,首先将会介绍下spark在shell中的交互api,然后展示下如何使用java,scala,python等语言编写应用.可以查看编程指南了解更多的内容. 为了良好 ... 
- Wakatime 测试工作时间
			Wakatime – 现在几点了,你在做什么呢 前面提到了一个用来QS自己的工具Clarify.这次介绍一个专门给程序员用的工具.大家都知道一万小时定律,但我究竟写java写了多久了呢?WakaTim ... 
- Atitit View事件分发机制
			1. Atitit View事件分发机制 1. Atitit View事件分发机制1 1.1. 三个关键方法 dispatchTouchEvent onInterceptTouchEvent onTo ... 
- 微信蓝牙设备开发教程之获取设备deviceid和二维码(3)
			文章转载地址 http://www.vxzsk.com/87.html 设备授权 调用 设备授权新接口 ,获取deviceid和二维码,然后利用获取到的deviceid更新设备属性(如mac地址, ... 
- jdk1.7.0_80源码包结构
			解压源码src.zip,jdk源码结构如下所示: src |--com.sun sun公司对jdk的实现,Oracle官方不支持,不保证跨平台(可能一些类linux有而windows没有),甚至 ... 
- Torch学习笔记1--Torch简介
			Torch是什么 Torch是一个由Lua语言开发的深度学习框架,目前支持Mac OS X 和Ubuntu 12及以上,官网 ,github地址. 具有如下特点: 交互式开发工具 可视化式的工具 第三 ... 
