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、访问

  • 相关阅读:
    POJ 2752 Seek the Name, Seek the Fame
    POJ 2406 Power Strings
    KMP 算法总结
    SGU 275 To xor or not to xor
    hihocoder 1196 高斯消元.二
    hihoCoder 1195 高斯消元.一
    UvaLive 5026 Building Roads
    HDU 2196 computer
    Notions of Flow Networks and Flows
    C/C++代码中的笔误
  • 原文地址:https://www.cnblogs.com/fger/p/12131598.html
Copyright © 2011-2022 走看看