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