zoukankan      html  css  js  c++  java
  • IOC容器

    IOC容器(控制反转)是一种思想,Autofac是一款IOC框架,Autofac的反射dll

    ASP.NET Core本身已经集成了一个轻量级的IOC容器,开发者只需要定义好接口后,在Startup.cs的ConfigureServices方法里使用对应生命周期的绑定方法即可,常见方法如下

    在start.up类中ConfigureServices方法对实例进行注册

    services.AddTransient<IApplicationService,ApplicationService>();
    services.AddSingleton<IApplicationService,ApplicationService>(); 
    services.AddScoped<IApplicationService,ApplicationService>();

    这三个方法都是将我们实例注册进去,只不过是生命周期不一样。

    AddSingleton:整个应用程序生命周期以内只创建一个实例,相当于一个静态类。

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

    AddTransient:每一次都会创建一个新的实例。

    PS:本demo将主要采用构造函数注入的方式。

    约定:

    1、仓储层接口都以“I”开头,以“Repository”结尾。仓储层实现都以“Repository”结尾。

    2、服务层接口都以“I”开头,以“Service”结尾。服务层实现都以“Service”结尾。

    一、示例

    1、新建解决方案,并初始化默认访问路由

     2、创建自己服务

     3、将自己的服务注入

     4、使用

     代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    
    namespace IOCTest.Controllers
    {
        [Route("api/[controller]/[action]")]
        [ApiController]
        public class HomeController : ControllerBase
        {
            private readonly ITestService _testService;
            public HomeController(ITestService testService)
            {
                _testService = testService;
            }
            // GET: api/<controller>
            [HttpGet]
            public IEnumerable<string> Get()
            {
                var str = _testService.GetName();
    
                return new string[] { "value1", "value2", str };
            }
        }
    }

     注意:

    IOC的<接口,方法的>绑定解决耦合度

    二、第二种写法

    1、新增依赖注入类DIIoc

    代码如下:

    using Microsoft.Extensions.DependencyInjection;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace IOCTest
    {
        public class IService
        {
        }
        public interface ITestService
        {
            string GetName();
        }
        public class TestService : ITestService
        {
            public string GetName()
            {
                return "功能点1";
            }
        }
        /// <summary>
        /// DI依赖注入
        /// </summary>
        public class DIIoc
        {
            /// <summary>
            /// IServiceCollection  类型是 using Microsoft.Extensions.DependencyInjection;
            /// </summary>
            /// <param name="services"></param>
            public static void Injection(IServiceCollection services)
            {
                //Transient:每一次调用服务都会创建一个新的实例
                //Scoped:每一次请求只创建一个实例
                //Singleton :单例,在整个应用程序生命周期以内只创建一个实例
                services.AddScoped<ITestService, TestService>();
            }
        }
    }

    2、 在StartUp.cs中添加服务

    3、运行效果

     三、注入自身类型

    参考

    1、更改注入自身类型

     并添加到服务

    //添加服务
    DIIoc.Injection(services);

    2、访问

  • 相关阅读:
    「网络流 24 题」魔术球
    「网络流 24 题」圆桌聚餐
    「网络流 24 题」最小路径覆盖
    「网络流 24 题」太空飞行计划
    「网络流 24 题」搭配飞行员
    「网络流 24 题」负载平衡
    「网络流 24 题」数字梯形
    餐巾计划问题
    让Double类型完整显示,不用科学计数法显示E
    kotlin新工程
  • 原文地址:https://www.cnblogs.com/fger/p/12131598.html
Copyright © 2011-2022 走看看