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);