• .net core 2.0学习记录(三):内置IOC与DI的使用


        本篇的话介绍下IOC和ID的含义以及如何使用.Net Core中的DI。

    一。我是这么理解IOC和DI的:

        IOC:没有用IOC之前是直接new实例来赋值,使用IOC之后是通过在运行的时候根据配置来实例化具体对象,这个控制权由内部转到外部的过程就可以理解为IOC(控制反转)

        DI:由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中

    二。在.Net Core中使用

       假设有这样一个业务:现在网站记录日志是存在文本文件中,可能以后会需要存在数据库,这时候就不能直接new来实例化具体对象,可以用DI来解决。

       1.我们先建好一个.Net Core项目,在其中添加一个接口和两个具体实现类:

        public interface ILog
        {
            void Write(string msg);
        }
        public class FileLog : ILog
        {
            public void Write(string msg)
            {
                //假设这里是存入文件
                Debug.WriteLine("FileLog:" + msg);
            }
        }
        public class DBLog : ILog
        {
            public void Write(string msg)
            {
                //假设这里是存入数据库
                Debug.WriteLine("DBLog:" + msg);
            }
        }

       2.在Startup的ConfigureServices方法中注册,假设现在使用文件来记录日志:

            public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc();
    
                services.AddSingleton<ILog, FileLog>();
            }
        public class HomeController : Controller
        {
            ILog log = null;
            public HomeController(ILog _log)
            {
                log = _log;
            }
    
            public IActionResult Index()
            {
                log.Write("记录一个错误消息");
                return View();
            }
        }

          现在运行项目的话会输出 FileLog:记录一个错误消息 ,如果以后需要改成数据库只需要改成如下:

    services.AddSingleton<ILog, DBLog>();

          通过这种方式就将具体实现解耦了,以后新增Redis记录或者其他记录方式,只需要增加对应的类实现ILog接口再通过配置即可。

          如果我们想使用.Net Core中已经通过DI注册好的类,可以在控制器的构造函数中写上接口名即可(前提是.Net Core中已经注册了该接口的具体实现类)

            public HomeController(IHostingEnvironment env)
            {
                Console.BackgroundColor = ConsoleColor.Red;
                Console.WriteLine(env.EnvironmentName);
            }

     

    三。.NET Core DI 为我们提供的实例生命周有三种:

    1.Transient: 每一次都会创建一个新的实例

    2.Scoped:  在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)

    3.Singleton :整个应用程序生命周期以内只创建一个实例

    我们可以通过具体业务来选择不同的实例创建方式。

  • 相关阅读:
    java内部类案例
    java内部类之成员内部类之局部内部类
    java内部类之成员内部类之匿名内部类
    java静态内部类
    java内部类之成员内部类实例
    java内部类之成员内部类
    UDP和TCP的区别和联系
    SSM
    连接各种数据库
    JDBC数据库连接
  • 原文地址:https://www.cnblogs.com/zuqing/p/8259690.html
Copyright © 2020-2023  润新知