.NET5.0 依赖注入,关于 Autofac 使用
前置
工具
VS2019
概念
关于以下几个概念,自行百度。
控制反转:IoC(Inversion of Control)
依赖注入:
容器:DI 容器(.NET Core 自带),Autofac(本文要说明使用的)
一、安装 Autofac
VS2019 打开 NuGet 管理器:工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet 程序包
如图,我安装了这两个

二、在项目中使用 Autofac
1、修改 Program.cs 文件
using 命名空间 Autofac.Extensions.DependencyInjection
这一步的操作,会替换 .NET Core 内置的 DI 容器。
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
} public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())//添加Autofac服务
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
2、修改 Startup.cs 文件
using 命名空间 Autofac
添加 ConfigureContainer() 方法
public class Startup
{
//其他代码
public void ConfigureContainer(ContainerBuilder builder)
{
//……
}
}
三、多种注入方式
1、构造函数注入
修改 Startup.cs 里面 ConfigureContainer() 方法
public class Startup
{
//其他代码
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType<UserService>().As<IUserService>();
}
}
控制器代码,其中 rtnCommon 只是一个通用 Json 返回格式,无需关注。请关注注释的几句代码。
public class AccountController : Controller
{
private IUserService _userService; //定义
public AccountController(IUserService userService)
{
_userService = userService; //完成注入
}
public async Task<IActionResult> Login(modUser user)
{
rtnCommon rtn = new rtnCommon();
rtn = await _userService.Login(user); //调用
return Json(rtn);
}
}
对应的 Interface 和 class,定义接口和实现接口。
//接口
public interface IUserService
{
Task<rtnCommon> Login(modUser user);
}
//实现
public class UserService : IUserService
{
public async Task<rtnCommon> Login(modUser user)
{
rtnCommon rtn = new rtnCommon();
rtn = new rtnCommon(enmReturnCode.Success);
return rtn;
}
}
2、属性注入
修改 Startup.cs 里面 ConfigureContainer() 方法
public class Startup
{
//其他代码
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType<UserService>().As<IUserService>().PropertiesAutowired(); //属性注入
}
}
控制器中代码
public class AccountController : Controller
{
public IUserService _userService { set; get; } //属性注入 public async Task<IActionResult> Login(modUser user)
{
await _userService.Login(user); //调用
//其他代码
}
}
3、方法注入
修改 Startup.cs 里面 ConfigureContainer() 方法
public class Startup
{
//其他代码
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType<UserRepository>()..As<IUserRepository>();
builder.RegisterType<UserService>().OnActivated(e => e.Instance.SetService(e.Context.Resolve<IUserRepository>())).As<IUserService>(); //方法注入
}
}
UserService.cs 代码
public class UserService :IUserService
{
private IUserRepository _userRepository; public void SetService(IUserRepository userRepository)
{
_userRepository = userRepository; //方法注入
}
}
4、实现批量注入
需要 using 命名空间 System.Reflection
修改 Straup.cs 文件中的 ConfigureContainer() 方法
约定接口(Interface)和实现(class)都是以 Service 结尾的。
public void ConfigureContainer(ContainerBuilder builder)
{
//加载程序集
var urpIService = Assembly.Load("urp.IService");
var urpService = Assembly.Load("urp.Service");
//根据名称约定(服务层的接口和实现均以Service结尾),实现服务接口和服务实现的依赖
builder.RegisterAssemblyTypes(urpIService, urpService)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces().PropertiesAutowired();
}
四、生命周期
五、Autofac 配置文件
参考来源
https://www.cnblogs.com/Cjb8973/p/13858902.html (Cjb8973 的 一个非常简单的入门级ASP.NET Core Autofac使用)
https://www.cnblogs.com/baocaige/p/11987902.html (Liu_Cabbage 的 FineAdmin.Mvc 使用ok-admin+ASP.NET MVC搭建的通用权限后台管理系统)【参考了是他的开源项目,不过项目是MVC5的】
.NET5.0 依赖注入,关于 Autofac 使用的更多相关文章
- .Net Core 3.0依赖注入替换 Autofac
今天早上,喜庆的更新VS2019,终于3.0正式版了呀~ 有小伙伴问了一句Autofac怎么接入,因为Startup.ConfigureServices不能再把返回值改成IServiceProvide ...
- 06、NetCore2.0依赖注入(DI)之整合Autofac
06.NetCore2.0依赖注入(DI)之整合Autofac 除了使用NetCore2.0系统的依赖注入(DI)框架外,我们还可以使用其他成熟的DI框架,如Autofac.Unity等.只要他们支持 ...
- 大比速:remoting、WCF(http)、WCF(tcp)、WCF(RESTful)、asp.net core(RESTful) .net core 控制台程序使用依赖注入(Autofac)
大比速:remoting.WCF(http).WCF(tcp).WCF(RESTful).asp.net core(RESTful) 近来在考虑一个服务选型,dotnet提供了众多的远程服务形式.在只 ...
- 05、NetCore2.0依赖注入(DI)之Web应用启动流程管理
05.NetCore2.0依赖注入(DI)之Web应用启动流程管理 在一个Asp.net core 2.0 Web应用程序中,启动过程都做了些什么?NetCore2.0的依赖注入(DI)框架是如何管理 ...
- 07、NetCore2.0依赖注入(DI)之生命周期
07.NetCore2.0依赖注入(DI)之生命周期 NetCore2.0依赖注入框架(DI)是如何管理注入对象的生命周期的?生命周期有哪几类,又是在哪些场景下应用的呢? -------------- ...
- ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用
上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...
- ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用
话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...
- asp.net core2.0 依赖注入 AddTransient与AddScoped的区别 - 晓剑 - CSDN博客
原文:asp.net core2.0 依赖注入 AddTransient与AddScoped的区别 - 晓剑 - CSDN博客 原文地址:http://www.tnblog.net/aojiancc2 ...
- 深入浅出依赖注入容器——Autofac
1.写在前面 相信大家对IOC和DI都耳熟能详,它们在项目里面带来的便利大家也都知道,微软新出的.NetCore也大量采用了这种手法. 如今.NetCore也是大势所趋了,基本上以.Net为技术主导的 ...
随机推荐
- scp命令的简单使用
简介: scp是 secure copy的缩写, 是linux系统下基于ssh登陆进行安全的远程文件拷贝命令,Linux scp命令用于Linux之间复制文件和目录. 语法 scp [-1246BCp ...
- 设置linux下oracle开机自启动
1.修改配置文件,vi /etc/oratab orcl:/u01/app/oracle/product/11.2.0/db_1:Y 2.创建启动文件,/etc/init.d/ #!/bin/sh # ...
- transient关键字和volatile关键字
看到HashSet的源代码的时候,有一个关键字不太认识它..transient,百度整理之: Java的Serialization提供了一种持久化对象实例的机制,当持久化对象时,可能有一些特殊的对象数 ...
- SpringBoot(2):运行原理
一. pom.xml 进入父项目,这里才是真正管理SpringBoot应用里面所有依赖版本的地方,SpringBoot的版本控制中心:以后我们导入依赖默认是不需要写版本:但是如果导入的包没有在依赖中管 ...
- @NotBlank 注解不生效
1. @NotBlank 注解是用来校验 String 类型的参数是否为空的 2. 使用方法 (1)Spring-boot 某一个版本之前 spring-boot-starter-web 中有包含 h ...
- 【Spring Framework】Spring入门教程(六)Spring AOP使用
Spring的AOP 动态代理模式的缺陷是: 实现类必须要实现接口 -JDK动态代理 无法通过规则制定拦截无需功能增强的方法. Spring-AOP主要弥补了第二个不足,通过规则设置来拦截方法,并对方 ...
- JQuery 和 CSS 等选择器:
JQuery 选择器: CSS 选择器:
- ActiveMQ(二)——ActiveMQ的安装和基本使用
一:安装 2.启动之后成功 二.创建实例测试ActiveMQ 配置Maven所需的依赖 <dependency> <groupId>org.apache.activemq< ...
- 机器学习算法中的评价指标(准确率、召回率、F值、ROC、AUC等)
参考链接:https://www.cnblogs.com/Zhi-Z/p/8728168.html 具体更详细的可以查阅周志华的西瓜书第二章,写的非常详细~ 一.机器学习性能评估指标 1.准确率(Ac ...
- Nginx支持php
目录 一.简介 二.配置 三.测试 四.参数 一.简介 Nginx本身只能解析html文件,但有些网页是php写的,就需要Nginx连接php,将网页解析成html再发给客户端. 配置中将.php 结 ...