设计模式(一)单例模式:创建模式 ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等

时间:2022-11-29 22:02:14

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

先聊一下关于设计的几个原则
(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)提供一个访问它的全局访问点

利用代码实现一个简洁的单例

设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等
 class SingletonClass
    {
        private static volatile SingletonClass instance = new SingletonClass();
        //私有的构造函数
        private SingletonClass()
        {
        }
        public static SingletonClass Newinstance
        {
            get
            {
                return instance;
            }
        }
    }
设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等

这个类在被调用时 SingletonClass.Newinstance();

优点:(1)确保一个类只有一个实例;

(2)提供一个访问它的全局访问点

缺点:(多线程环境下就会破坏单利的初衷:会形成多个类的实例)

利用代码实现  在多线程环境下的单例

通过双重判断 对资源进行锁定 确保再多线程环境下确保只有一个实例

注意:代码注释

设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等
    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;
            }
        }
    }
设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等

利用代码实现   单线程多线程通用单例

优点:静态构造函数 在调用时 只会产生一个,系统在默认的情况下仿佛已经对资源加过锁
缺点是不能带参数   
原因: (1):静态函数不允许不允许出现访问修饰符
            (2):静态构造函数必须无参数

    class SingletonCurrency
    {
        public static readonly SingletonCurrency example = new SingletonCurrency();

        private SingletonCurrency() { }
    }

下面代码是读上面代码的解释代码:

public static readonly SingletonCurrency example = new SingletonCurrency();  等同于省略了静态构造函数,这里的省略不是编译上的省略而是代码上的省略,在系统编译时还是会有一个静态构造的

设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等
 class SingletonCurrency_Remark
    {
        public static readonly SingletonCurrency_Remark example ;
        /// <summary>
        /// 静态构造函数
        /// </summary>
        static SingletonCurrency_Remark()
        {
            example = new SingletonCurrency_Remark();
        }
        private SingletonCurrency_Remark() { }
    }
设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等

推荐书籍     大话设计模式 (中文)   《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)如图下图所示

设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等

和我们的 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 方法 使用

                             

设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等
 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
        }
设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等

     3.2  Configure 方法的使用

设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等
//重新定义 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?}");
            //});
        }
设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等

有关 IHostingEnvironment          参考 https://msdn.microsoft.com/zh-cn/library/system.web.hosting.hostingenvironment.aspx

  (4) Program类  初始内容 

设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等
public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等

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

设计模式(一)单例模式:创建模式    ASPNET CORE WEB 应用程序的启动 当项目中 没有STARTUP.CS 类如何设置启动 配置等等
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 类如何设置启动 配置等等

 
    不足之处希望大家指出,相互交流学习