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;
}
}
}
分类:
.NET后端开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2020-02-25 寒假Day33:简单递归+简单贪心(区间相交问题变形)