设计模式(创建型模式):单例模式

单例模式用于在整个软件系统当中保持唯一实例,在 C# 当中最能够体现此概念的就是静态类,静态类的生命周期是跟随整个程序,并且在整个程序中仅保有一个实例。 不过在这里我们不再详细阐述单例模式与静态类有什么区别,如果有兴趣的话可以查看 这篇博文 和 这篇博文。 这里说一下个人的理解: 单例模式可以用实现接口与继承,而静态类是无法实现的。 单例模式可以方便进行 Mock 测试。 单例对象可以很方便的进行替换。 静态类/静态方法更多的是用于工具类方法,是无状态的。 为了保证我们的对象是全局唯一的,那么我们肯定不能够通过 new 来创建单例对象,所以我们首先要将其构造函数设为私有的,其次我们肯定要有一个 static 字段来保存我们唯一的实例化对象。 既然不能通过 new 来实例化对象,则需要提供一个全局访问点。下面我们就来看一下具体实现: 1 2 3 4 5 6 7 8 9 10 11 public class SingletonImplementation { private static SingletonImplementation m_instance; private SingletonImplementation(){} public static SingletonImplementation GetInstance() { if(m_instance == null) m_instance = new SingletonImplementation(); return m_instance; } } 实现起来是相当简单的,这里我们将构造函数设置为私有的,然后通过 GetInstance 方法来取得对象的实例。其实这里可以改用一个静态属性来实现,更加方便。 如果考虑到线程安全的话,就需要加一个 locker 来保证访问不会重复创建对象。因为如果在多线程环境当中调用这个静态类的时候,可能在同一时间都会访问到 m_instance,这个时候 m_instance 都为空的情况下就会连续创建两次实例,这就违背了初衷。最简单的方法就是加锁,让 m_instance 在同一时间只能一个线程访问这个对象。

Nuget 构建服务器与常用命令

公司出于某些原因需要自己在内部网络搭建一个私有的 Nuget 服务器,而且要运行在 Linux服务器上面。如果说 Windows 下搭建的话很简单,直接在项目当中引入 Nuget 的库就 OK,这儿的话 .Net Core 还没有相应的教程。 不过在万能的 Docker 上面找到了一个 Simple-Nuget-Server 镜像,具体使用方式在 这里。安装方法请参考之前的 博文,安装好 Docker 按着流程走就行了。 这里记录一下发布到 Nuget 服务器的常用命令与使用方法,首先你需要得到 Nuget 官网下载 Nuget.exe 程序,地址在这儿。 那么我们新建一个库项目,这里我仅以 .NetCore 程序为例,有两种方式可以生成 .nupkg 文件: 在项目的 .csproject 目录下打开 Shell 工具或者命令行,然后执行 dotnet pack 命令。 在项目属性右键,在 Package 这一栏当中勾选上 generate nuget package,并且在里面可以 控制包版本等其他信息。 当我们的 nupkg 文件生成成功之后就可以通过 Nuget.exe 的 push 命令来发布包文件了。 其命令如下: 1 nuget push -Source <你的 NUGET 服务器地址> -ApiKey <安装时候填写的密钥> <包文件路径> 例如: 1 nuget push -Source http://nuget.

.Net Core 获取 HttpContext.Current 以及 AsyncLocal 与 ThreadLocal

在 DotNetCore 当中不再像 MVC5 那样可以通过 HttpContext.Current 来获取到当前请求的上下文。 不过微软提供了一个 IHttpContextAccessor 来让我们访问当前请求的 Http 上下文,其定义 如下: 1 2 3 4 5 6 7 namespace Microsoft.AspNetCore.Http { public interface IHttpContextAccessor { HttpContext HttpContext { get; set; } } } 需要使用的话需要将其添加到 Ioc 容器当中,在 Startup 类的 ConfigureService 我们可以将其默认实现注册到 Ioc 之中。 1 2 3 4 public void ConfigureService(IServiceCollection services) { services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); } 那么我们可以来看看 HttpContextAccessor 的具体实现: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 using System.

在 DotNetCore 下的 Swagger UI 自定义操作

1.Swagger UI 是什么? Swagger UI 是一个在线的 API 文档生成与测试工具,你可以将其集成在你的 API 项目当中。 支持 API 自动同步生成文档 高度自定义,可以自己扩展功能 前后端分离时方便前端进行 API 接口测试 2.如何应用? 这里仅介绍在 DotNetCore 下如何集成 Swagger UI。 新建一个 API 项目 从 NuGet 下载 Swagger UI 包 配置 Swagger UI 安装好 Swagger 之后,在需要生成 API 文档的项目当中勾选 XML documentation file. 之后我们需要在 StartUp 当中配置 Swagger 相关的设置。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.

使用 SharpZipLib 打包数据到 ZIP 文件

SharpZipLib 是一个优秀的开源的第三方压缩库,可以通过这个库将一些导出的文件打包到一个 ZIP 文件当中供用户下载。 GITHUB 地址:https://github.com/icsharpcode/SharpZipLib NuGet 地址:https://www.nuget.org/packages/SharpZipLib/ 具体关于库的介绍可以参考官方文档,不过也没有太多介绍的,直接引入库之后按 F12 可以看到其中的元数据,没几个方法,下面讲解一下基本用法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class TestClass { public void TestMethod() { string _zipPath = Path.Combine("D:\导出.zip"); using (ZipFile zip = ZipFile.Create(_zipPath)) { zip.BeginUpdate(); // 这里 Add 方法接收两个参数, 分别是文件路径和实体名称 zip.Add(_allPath, Path.GetFileName(_allPath)); foreach (var item in _xlsFileNames) { zip.Add(Path.Combine(_filePath, item), Path.GetFileName(item)); } // 当然还有一个方法就是 zip.
Built with Hugo
主题 StackJimmy 设计