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

先聊一下关于设计的几个原则
(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 类如何设置启动 配置等等的更多相关文章

  1. AspNet Core Web 应用程序的启动 当项目中 没有Startup.cs 类如何设置启动 配置等等

    感叹: Core 16年6月1号 在中国宣布上线 到现在已经快经历两年时间了,目前版本已经到了2.0 就目前的前景来看,个人感觉 到2020年才可能有所起色,等到Core更成熟 个人看法:在.net这 ...

  2. AspNet Core Web 应用程序的启动(有关 Program.cs类/ Startup.cs类 ) 当项目中干掉 Startup.cs 类如何设置启动 配置等等

    .有关怎么创建Core MVC/API 这里就不说了,前段时间的博客有说过: 1.  项目生成后会有如图所示两个类 Program类Startup类 2. Startup类  初始内容 public ...

  3. [03-2]VS2017 创建 ASP.NET Core Web 程序

    VS2017 创建 ASP.NET Core Web 程序 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开始学 ...

  4. [03]使用 VS2019 创建 ASP.NET Core Web 程序

    使用 VS2019 创建 ASP.NET Core Web 程序 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开 ...

  5. 在Mac下创建ASP.NET Core Web API

    在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉 ...

  6. python设计模式之常用创建模式总结(二)

    前言 设计模式的创建模式终极目标是如何使用最少量最少需要修改的代码,传递最少的参数,消耗系统最少的资源创建可用的类的实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常 ...

  7. Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。

                                                                                                        ...

  8. Asp.Net Core Web应用程序—探索

    前言 作为一个Windows系统下的开发者,我对于Core的使用机会几乎为0,但是考虑到微软的战略规划,我觉得,Core还是有先了解起来的必要. 因为,目前微软已经搞出了两个框架了,一个是Net标准( ...

  9. ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)

    在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...

随机推荐

  1. JavaScript(十一)Dom

    Dom(Document object module) 1.获取dom对象的方法 正常用的方法 推荐 getElementById()//通过id选择唯一的dom getElementsByClass ...

  2. 启用adb wifi无线调试功能(无需root)

    1  工具 电脑.手机 2  前提 电脑和手机出于同一网段 3  步骤 以管理员方式打开cmd,运行 adb tcpip 5555(执行tcpip调试模式) adb connect  192.168. ...

  3. oracle数据库过期

    本文转载自http://soft.chinabyte.com/database/6/12320006.shtml[来源:比特网 作者:悠虎] 由于Oracle11G的新特性所致,经常会遇到使用sqlp ...

  4. HDU_2844_(多重背包)

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  5. 扩增子分析解读4去嵌合体 非细菌序列 生成代表性序列和OTU表

    本节课程,需要先完成 扩增子分析解读1质控 实验设计 双端序列合并 2提取barcode 质控及样品拆分 切除扩增引物 3格式转换 去冗余 聚类   先看一下扩增子分析的整体流程,从下向上逐层分析 分 ...

  6. CAD把当前图上数据保存为一个二进流对象(com接口VB语言)

    主要用到函数说明: MxDrawXCustomFunction::WriteBinStreamEx 把当前图上数据保存为一个二进流对象,详细说明如下: 参数 说明 LPCTSTR pszPasswor ...

  7. 一天搞定jQuery(三)——使用jQuery完成复选框的全选和全不选

    还记得之前我使用JavaScript来实现复选框的全选和全不选效果吗?如果读者初次翻阅本文,可记得看看教你一天玩转JavaScript(七)——使用JavaScript完成复选框的全选和全不选的效果! ...

  8. php中 如何找到session 的保存位置

    [前言] 刚刚想测试FQ操作,需要删除session,这里记录分享下 [主体] (1)想要查看session保存的目录,需要先找到 php.ini配置文件 (2)在php.ini文件中查找 sessi ...

  9. 【转载】文件上传命令rz和下载命令sz的安装

    一.xshell工具简介 Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议.其可以在Windows界面下用来访 ...

  10. .net core 中简单封装Dapper.Extensions 并使用sqlsuger自动生成实体类

    引言 由公司需要使用dapper  同时支持多数据库 又需要支持实体类 又需要支持sql 还需要支持事务 所以采用了 dapper + dapperExtensions  并配套 生成实体类小工具的方 ...