• 六、单列模式-简单案例


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Common;
    using Microsoft.AspNetCore.Mvc;
    
    
    namespace OTA.Controllers
    {
        public class IndexController : Controller
        {
            public IActionResult Index()
            {
    
                Common.G<H>.Resolve.h();
    
                string s=Common.G<H>.Resolve.hh();
    
                ViewBag.Message = s;
    
                return View();
    
            }
    
        }
    
        // 调用的方法。
        public class H
        {
            public void h()
            {
                //return 2;
                Console.WriteLine("H2");
            }
    
            public string hh()
            {
    
                return "GG2";
            }
    
        }
    
    }
    
    @{
        Layout = null;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Index</title>
    </head>
    <body>
        <h3>@ViewBag.Message</h3>
    </body>
    </html>
    

      

    单列封装的类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    //UnitOfWork
    namespace Common
    {
    
        //四、特例    这个实现不需要指定一个类
        public class UnitOfWork    //2、点列类加一个封装
        {
            private Dictionary<Type, Lazy<object>> Services { get; set; }
    
            private UnitOfWork()//构造函数 的时候new 一个Server 键值集合
            {
                Services = new Dictionary<Type, Lazy<object>>();
            }
    
            //单列模式-懒汉模式
            static UnitOfWork instance;  //或者  static F instance=null 写法
            static object locker = new object();  //返回对象实例用到的锁
            private static UnitOfWork Instance   //通过属性方式返回对象实例
            {
                get
                {
                    lock (locker)
                    {
                        if (instance == null)
                            instance = new UnitOfWork();
                        return instance;
                    }
                }
            }
            public static T Resolve<T>() where T : new()//不过它调用的是这个  即定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
            {
                Lazy<object> service;
                if (Instance.Services.TryGetValue(typeof(T), out service))
                {
                    return (T)service.Value;
                }
                else
                {
                    Instance.Services[typeof(T)] = new Lazy<object>(() => new T());
                    return Resolve<T>();
                    //throw new KeyNotFoundException(string.Format("Service not found for type '{0}'", typeof(T)));
                }
            }
    
        }
    
        // 1、封装单列类的,这样单列类就不会对外公开使用了
        public static class G<T> where T : new() //使用的时候可以指定类型,这样就可以在类内使用    要求:  G类必须Status 且<T>泛型   好像加不加都行 为什么
        {
            public static void g()
            {
                Console.WriteLine("封装的外部类");
            }
            public static T Resolve  //单列不一定是返回自己,也可能返回其他的对象,这个“单”说的就是返回的对象永远的一个
            {
                get
                {
                    return UnitOfWork.Resolve<T>();//这里的T就是类
                }
            }
    
        }
    
    
    }
    

      

      

  • 相关阅读:
    MVC 自定义异常过滤特性
    写一个左中右布局占满屏幕,其中左右两块是固定宽度200,中间自适应宽度, 要求先加载中间块,请写出结构及样式。
    请写出jQuery绑定事件的方法,不少于两种
    用js写个原生的ajax过程
    link和@import的区别
    attribute和property的区别是什么?
    请简要描述margin重复问题,及解决方式
    display:none;与visibility:hidden;的区别
    web标准以及w3c标准
    css优先级
  • 原文地址:https://www.cnblogs.com/fger/p/10573454.html
Copyright © 2020-2023  润新知