Intern Day8 - 依赖注入DI在ASP.NET Core中的基本用法 构造函数注入
依赖注入的实现方式/基本用法有三种。
-
构造函数注入(最常用的注入方式,主要要会写这个)
-
如果你需要添加一个自定义服务类,你就需要选择一个生存期。
-
构造函数注入常用于在服务构建上定义和获取服务依赖。
-
-
setter注入
-
接口注入:接口注入使用接口来提供setter方法。
下面写的是最常用的构造函数注入。
IMessageService.cs
新建的Services文件夹下面的IMessageService.cs文件:
namespace WebApplication3.Services
{
//创建接口,因为我们注册服务的话都是以接口的形式来注册的
//因为我们要依赖抽象,而不是直接实现
public interface IMessageService // 是一个消息服务
{
// 这个接口我们只定义一个方法
void Send(); // 发送消息的方法
// 现在我们要去实现这个接口
}
}
EmailService.cs
新建的Services文件夹下面的EmailService.cs文件:
using System;
namespace WebApplication3.Services
{
// 2、去实现IMessageService这个接口
public class EmailService:IMessageService
{
public void Send()
{
Console.WriteLine("***Hello Email!***\n");
}
}
}
//3、如何把Email这个服务添加到容器里
Startup.cs
Startup.cs中的ConfigureServices方法:
// 这个ConfigureServices方法用于处理中间件/配置服务,在时候被执行。是由主机构建器调用的
// IServiceCollection服务配置接口,用来配置常用服务及依赖注入
public void ConfigureServices(IServiceCollection services) // 注入容器的接口
{
// 在我们的主机构建器里面,它就已经把容器创建好了
// 整个应用都在主机里,整个应用都是可以用到这个容器的
// 只要可以用到容器那么就可以从容器里获取已注册的任何类型的实例
//这些都是ASP.NET Core内置的服务组件 add
services.AddControllers();
// .AddControllers()在我们的容器里添加对控制器和API相关功能的支持,但是不支持视图和页面(这是WebAPI模板默认使用的)
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo {Title = "WebApplication3", Version = "v1"});
});
//如何把Emil添加到容器中
// 因为是一个自定义的服务,所以我们必须要选择一个生存期(选择哪个生存期看自己的需求)
//这个是暂时生存期,这是一个泛型,向我们的服务容器中添加了一个具有暂时生存周期的自定义服务类
// 第一个泛型参数是它的接口/抽象类,第二个参数是前面这个服务的实现
services.AddTransient<IMessageService, EmailService>();
services.AddScoped<IMessageService, EmailService>(); // 作用域生存期
services.AddSingleton<IMessageService>(); // 单例生存期
//如果像这样注册了三次,则后面的生效,内置的不支持
// 属性注入,就用第三方的
}
HomeController.cs
Controllers文件夹下面新建的HomeController.cs文件:
using WebApplication3.Services;
// 在Home这个控制器中使用EmailServices
namespace WebApplication3.Controllers
{
// MVC或者API的应用,当你在控制器中这么写的时候,
// .NET Core会自动把你已注册的服务给注入进来,
// 不需要你再去实例化了new
public class HomeController
{
private IMessageService _messageService;
// 构造函数注入
public HomeController(IMessageService messageService)
{
_messageService = messageService;
}
}
}