设计模式(一)单例模式:创建模式 ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等
设计模式(一)单例模式:创建模式
先聊一下关于设计的几个原则
(1)单一原则(SRP):一个类应该仅有一个引起它变化的原因 :意思就是 (一个类,最好只负责一件事情,并且只有一个引起它变化的原因
(2)开闭原则(OCP): 应该对扩展开放,但是对修改关闭:意思是(模块通过扩展的方式去应对需求的变化,应该尽量在不修改源代码的基础上面扩展)
(3)依赖倒置原则(DIP):高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象
高层模块不应该直接依赖于底层模块的具体实现,而应该依赖于底层的抽象。模块间的依赖是通过抽象发生,不发生直接的依赖关系,依赖关系是通过接口或抽象类为中间件产生的。
(4)LisKov 替换原则(LSP)(里式替换原则) :子类对象可以替换父类对象的位置 这里如果想了解的更清晰的话 了解一下 (斜变/逆变)
(5) 接口的隔离原则(IPS):(1)是不应该强行要求客户端依赖于它们不用的接口;(2)是类之间的依赖应该建立在最小的接口上面。简单点说,客户端需要什么功能,就提供什么接口,对于客户端不需要的接口不应该强行要求其依赖;类之间的依赖应该建立在最小的接口上面,这里最小的粒度取决于单一职责原则的划分。
还有其他 理解不深可就没敢说出来.
设计模式(1)单例模式(创建模式)
注意事项:
1. 允许子类派生
2. 不要实现 icloneable 接口 https://msdn.microsoft.com/zh-cn/library/system.icloneable.aspx 这个接口继承后可能会导致生成多个示例,违背了模式的原本意思
3. 不要序列化 理由同上
4. 不要再多线程下使用,(如果需要再多线程下使用的话见下面举例)
单利模式作用
(1)确保一个类只有一个实例;
(2)提供一个访问它的全局访问点
利用代码实现一个简洁的单例

class SingletonClass
{
private static volatile SingletonClass instance = new SingletonClass();
//私有的构造函数
private SingletonClass()
{
}
public static SingletonClass Newinstance
{
get
{
return instance;
}
}
}

这个类在被调用时 SingletonClass.Newinstance();
优点:(1)确保一个类只有一个实例;
(2)提供一个访问它的全局访问点
缺点:(多线程环境下就会破坏单利的初衷:会形成多个类的实例)
利用代码实现 在多线程环境下的单例
通过双重判断 对资源进行锁定 确保再多线程环境下确保只有一个实例
注意:代码注释

class multithreading_Singleton
{
//为了以防万一的出现
//volatile 关键字作用 当编译编译过程中 会对代码进行细微的调整,为了防止代码发生改变保证代码原意不变 多线程使用时有可能会导致 顺序发生改变 导致多个实例的发生
private static volatile multithreading_Singleton example = null;
//声明一个资源锁
private static object Lock = new object();
//私有的构造函数
private multithreading_Singleton()
{
}
public static multithreading_Singleton Newinstance
{
get
{
//保证多个线程不会同时进入判断
if (example == null)
{
//对资源进行锁定 Lock 只要是object 下的类型就OK了
lock (Lock)
{
if (example == null)
{
example = new multithreading_Singleton();
}
}
}
return example;
}
}
}

利用代码实现 单线程多线程通用单例
优点:静态构造函数 在调用时 只会产生一个,系统在默认的情况下仿佛已经对资源加过锁
缺点是不能带参数
原因: (1):静态函数不允许不允许出现访问修饰符
(2):静态构造函数必须无参数
class SingletonCurrency
{
public static readonly SingletonCurrency example = new SingletonCurrency();
private SingletonCurrency() { }
}
下面代码是读上面代码的解释代码:
public static readonly SingletonCurrency example = new SingletonCurrency(); 等同于省略了静态构造函数,这里的省略不是编译上的省略而是代码上的省略,在系统编译时还是会有一个静态构造的

class SingletonCurrency_Remark
{
public static readonly SingletonCurrency_Remark example ;
/// <summary>
/// 静态构造函数
/// </summary>
static SingletonCurrency_Remark()
{
example = new SingletonCurrency_Remark();
}
private SingletonCurrency_Remark() { }
}

推荐书籍 大话设计模式 (中文) 《Head First 设计模式》
希望大家指出不足之处 谢谢
ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等
感叹: Core 16年6月1号 在中国宣布上线 到现在已经快经历两年时间了,目前版本已经到了2.0 就目前的前景来看,个人感觉 到2020年才可能有所起色,等到Core更成熟
个人看法:在.net这条路上总感觉后劲不足,市场好像越来越小了。不过学习还是要学的,毕竟很喜欢 c#
(1)有关怎么创建Core MVC/API 这里就不说了,前段时间的博客中有说过:这里介绍的是有关 AspNetCore web 通用的基础知识,不针对单独的MVC/API介绍,也是我个人学习的结果,写出来希望和大家相互学习讨论,共同进步,希望在大家这里学到更多
(2) 项目创建生成后我们会看到这样两个类 (Program/Startup)如图下图所示

和我们的 ASP.NET MVC / ASP.NET Api 做比较 有关 Global.asax、FilterConfig.cs 和 RouteConfig.cs 等都被 Program.cs 和 Startup.cs两个类取而代之. 程序中 把Program.cs 作为 Web 应用程序的入口,程序启动的时候会调用 Startup.cs 类。
Startup.cs 作用就是,对项目中用到的 静态文件,管道,服务,日志,路由,数据库连接,过滤器的注册 等 所有的有关程序的启动运行中用到的。、
传统的MVC/Api 使用的比较多的开发人员初步接触都会感到有点迷茫,这里我们对这两个类进行剖析。不足之处希望大家指出。
(3) Startup类 初始内容
|
1
2
3
4
5
6
7
8
|
public void ConfigureServices(IServiceCollection services) { //运行时调用此方法。使用此方法向容器添加服务。 <br> }public void Configure(IApplicationBuilder app, IHostingEnvironment env) { //运行时调用此方法。使用此方法配置HTTP请求管道 } |
3.1 ConfigureServices 方法 使用

public void ConfigureServices(IServiceCollection services)
{
//注入MVC的服务 services.AddMvc();
// 添加 EF 服务 可以添加多个 使用多个EF 多个库
//services.AddEntityFrameworkSqlServer().AddDbContext<EFDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SqlServer")));
// services.AddEntityFrameworkSqlServer().AddDbContext<EFLogDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SqlServerLog")));
services.AddMvc();
// 添加自定义服务 :详见 IServiceCollection
}

3.2 Configure 方法的使用

//重新定义 IHostingEnvironment
public IHostingEnvironment HostingEnvironment { get; }
//运行时调用此方法。使用此方法配置HTTP请求管道
public void Configure(IApplicationBuilder app)
{
//判断当前的运行环境 是否是 Microsoft 如果是则返回true
// 如果要判断其他的运行环境比如Linux 可以用 env.IsEnvironment("environmentname") 要验证的环境名称 忽略大小写
if (HostingEnvironment.IsDevelopment())
{
//抓取错误信息 把错误信息生成 HTML
//关于这个等写到关于错误处理的时候详细说明**************************** app.UseDeveloperExceptionPage();
}
else
{
//自定义错误信息帮助页
app.UseExceptionHandler("/Home/Error");
}
//已被重写
//if (env.IsDevelopment())
//{
// app.UseDeveloperExceptionPage();
//}
//使用MVC默认路由 app.UseMvcWithDefaultRoute();
app.UseMvc(); //使用MVC的管道路径 可以在这里配置路由等操作
//app.UseMvc(
// routes =>
// {
// routes.MapRoute(
// name: "User",
// template: "{controller}/{action}/{id?}",
// defaults: new { controller = "User", action = "Index" });
// });
//app.UseMvc(routes =>
//{
// routes.MapRoute(
// name: "default",
// template: "{controller}/{action=Index}/{id?}");
//});
}

有关 IHostingEnvironment 参考 https://msdn.microsoft.com/zh-cn/library/system.web.hosting.hostingenvironment.aspx
(4) Program类 初始内容

public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}

4.1实现不依赖 Startup 启动程序 直接在 Program 类中 构建 扩展,配置,配置 ,扩展,日志

public class Program
{
public static IServiceCollection services { get; set; }
public static IHostingEnvironment HostingEnvironment { get; set; }
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
//构建 扩展,配置,配置 ,扩展,日志,ILoggerFactory
.ConfigureAppConfiguration((WebHostBuilderContext, config) =>
{
HostingEnvironment = WebHostBuilderContext.HostingEnvironment;
})
.ConfigureServices((IServiceCollection, services) =>
{
services.AddMvc();
})
.Configure(app =>
{
if (HostingEnvironment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
//使用MVC默认路由 app.UseMvcWithDefaultRoute();
//使用静态文件
app.UseStaticFiles("");
//配置路由
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});
})
//被替换掉的启动项
// .UseStartup<Startup>() .Build();
}

不足之处希望大家指出,相互交流学习
设计模式(一)单例模式:创建模式 ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等的更多相关文章
- AspNet Core Web 应用程序的启动 当项目中 没有Startup.cs 类如何设置启动 配置等等
感叹: Core 16年6月1号 在中国宣布上线 到现在已经快经历两年时间了,目前版本已经到了2.0 就目前的前景来看,个人感觉 到2020年才可能有所起色,等到Core更成熟 个人看法:在.net这 ...
- AspNet Core Web 应用程序的启动(有关 Program.cs类/ Startup.cs类 ) 当项目中干掉 Startup.cs 类如何设置启动 配置等等
.有关怎么创建Core MVC/API 这里就不说了,前段时间的博客有说过: 1. 项目生成后会有如图所示两个类 Program类Startup类 2. Startup类 初始内容 public ...
- [03-2]VS2017 创建 ASP.NET Core Web 程序
VS2017 创建 ASP.NET Core Web 程序 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开始学 ...
- [03]使用 VS2019 创建 ASP.NET Core Web 程序
使用 VS2019 创建 ASP.NET Core Web 程序 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开 ...
- 在Mac下创建ASP.NET Core Web API
在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉 ...
- python设计模式之常用创建模式总结(二)
前言 设计模式的创建模式终极目标是如何使用最少量最少需要修改的代码,传递最少的参数,消耗系统最少的资源创建可用的类的实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常 ...
- Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。
...
- Asp.Net Core Web应用程序—探索
前言 作为一个Windows系统下的开发者,我对于Core的使用机会几乎为0,但是考虑到微软的战略规划,我觉得,Core还是有先了解起来的必要. 因为,目前微软已经搞出了两个框架了,一个是Net标准( ...
- ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)
在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...
随机推荐
- Python学习日记之记录
列表 list=['1','2'] 元组 zoo=('1','2''3') 字典 d = {key1 : value1, key2 : value2 }
- Windows下压缩成tar.gz格式
tar.gz 是linux和unix下面比较常用的格式,几个命令就可以把文件压缩打包成tar.gz格式,然而这种格式在windows并不多见,WinRAR.WinZip等主流压缩工具可以释放解开,却不 ...
- json-server模拟REST API
介绍 可以开启一个服务前端使用 安装 npm i json-server -g 使用 $ json-server db.json -p 3000 // 在文件目录下执行上述命令,开放一个端口3000的 ...
- #NOIP前数学知识总结
我好菜啊…… 欧拉函数 欧拉函数φ(n),是小于n且和n互质的正整数(包括1)的个数. 性质: 1.对于质数n: φ(n)=n-1 2..对于n=pk φ(n)=(p-1)*pk-1 3.积性函数的性 ...
- blender_(uv应用)................http://digitalman.blog.163.com/blog/static/23874605620174172058299/
轻松学习Blender基础入门之九:UV-1 2017-06-21 14:24:49| 分类: Blender |举报 |字号 订阅 下载LOFTER 我的照片书 | [前言] ...
- 梦想MxWeb3D协同设计平台 2019.02.28更新
梦想MxWeb3D协同设计平台 2019.02.28更新 SDK开发包下载地址: http://www.mxdraw.com/ndetail_10130.html 在线演示网址: http://www ...
- 巩固JavaSE基础--IDEA完成实战项目
PS:学习完JavaSE基础后,需要有一个项目来测试自己的学习成果,并加以巩固.所以在这里,就让我们来学习下“一本糊涂账”项目吧.(此项目来源于Java自学网站) 项目完成效果图一览
- HDU - 4810 - Wall Painting (位运算 + 数学)
题意: 从给出的颜料中选出天数个,第一天选一个,第二天选二个... 例如:第二天从4个中选出两个,把这两个进行异或运算(xor)计入结果 对于每一天输出所有异或的和 $\sum_{i=1}^nC_{n ...
- asp.net mvc,基于aop实现的接口访问统计、接口缓存等
其实asp.net 上aop现有的框架应该蛮多的,比如静态注入式的PostSharp(新版本好像已经商业化了,旧版本又不支持.net4.0+),或者通过反射的(性能会降低). 本文则是通过mvc其中一 ...
- Go:内置函数
一.内置函数 close // 主要用来关闭channel len // 用来求长度,比如string.array.slice.map.channel new // 用来分配内存,主要用来分配值类型, ...