ASP.NET Core3.x 基础—注册服务(2)
这篇文章介绍在ASP.NET Core中注册一下自己的服务。
首先创建一个Services文件夹。在文件夹里面创建一个接口 IClock,以及两个类ChinaClock、UtcClock。这两个类分别实现 IClock这个接口。
IClock:
namespace WebApplication1.Services { public interface IClock { } }
ChinaClock:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebApplication1.Services { public class ChinaClock:IClock { } }
UtcClock:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebApplication1.Services { public class UtcClock:IClock { } }
先不管上面的接口和类,不写任何代码。。。
现在去Startup类去注册一下我们写的服务:先写接口,再写实现这个接口的具体的类
(详细见注释)
public void ConfigureServices(IServiceCollection services) { //负责配置依赖注入 //DI 依赖注入机制依赖于IOC容器(控制反转) //使用Asp.NET Core MVC,所有需要通道控制器和视图要进行注册一下m\v\c(通过services服务注册) services.AddControllersWithViews(); //注册一个自己写的服务 /* * AddSingleton 表示我们注册这个服务的生命周期 泛型中写了一个接口和实现接口的类,作用就是每当有其他类型请求IClock时,那IoC容器就返回一个ChinaClock */ services.AddSingleton(); }
注册服务完事了,我们就要用它
建一个Controllers文件夹,然后建立一个HomeController这样一个类
具体为什么要这样做见注释。补充一点方便理解:在Stratup中我们注入了服务,并且
我们注册的是 ChinaClock这个具体的类。这就表示通过构造函数我们就可以在此返回ChinaClock中的实例。
using Microsoft.AspNetCore.Mvc; using WebApplication1.Services; namespace WebApplication1.Controllers { public class HomeController:Controller { /* * 构造函数快捷键:ctor * 构造函数注入参数IClocks实例,如果IClock注册在我们的IoC容器中(也就是Startup类中),它所对应的具体类它的实例就会返回回来(实际上就解耦了) * DI 依赖注入优点: * -解耦,没有强依赖 * -利于单元测试 * -不需要了解具体的服务类 * -也不需要管理服务类的生命周期 * */ public HomeController(IClock clock) { } } }
如果我不想注入ChinaClock而是注入UtcClock,我们也可以这样写:这样写作用实际上有一个解耦的发生,我们注入两个不同的服务,但是接口里面的内容并没有发生变化。
DI优点上面代码块也注释了,可以看看。
//services.AddSingleton(); services.AddSingleton();