前置

工具

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 使用的更多相关文章

  1. .Net Core 3.0依赖注入替换 Autofac

    今天早上,喜庆的更新VS2019,终于3.0正式版了呀~ 有小伙伴问了一句Autofac怎么接入,因为Startup.ConfigureServices不能再把返回值改成IServiceProvide ...

  2. 06、NetCore2.0依赖注入(DI)之整合Autofac

    06.NetCore2.0依赖注入(DI)之整合Autofac 除了使用NetCore2.0系统的依赖注入(DI)框架外,我们还可以使用其他成熟的DI框架,如Autofac.Unity等.只要他们支持 ...

  3. 大比速: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提供了众多的远程服务形式.在只 ...

  4. 05、NetCore2.0依赖注入(DI)之Web应用启动流程管理

    05.NetCore2.0依赖注入(DI)之Web应用启动流程管理 在一个Asp.net core 2.0 Web应用程序中,启动过程都做了些什么?NetCore2.0的依赖注入(DI)框架是如何管理 ...

  5. 07、NetCore2.0依赖注入(DI)之生命周期

    07.NetCore2.0依赖注入(DI)之生命周期 NetCore2.0依赖注入框架(DI)是如何管理注入对象的生命周期的?生命周期有哪几类,又是在哪些场景下应用的呢? -------------- ...

  6. ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用

    上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...

  7. ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用

    话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...

  8. asp.net core2.0 依赖注入 AddTransient与AddScoped的区别 - 晓剑 - CSDN博客

    原文:asp.net core2.0 依赖注入 AddTransient与AddScoped的区别 - 晓剑 - CSDN博客 原文地址:http://www.tnblog.net/aojiancc2 ...

  9. 深入浅出依赖注入容器——Autofac

    1.写在前面 相信大家对IOC和DI都耳熟能详,它们在项目里面带来的便利大家也都知道,微软新出的.NetCore也大量采用了这种手法. 如今.NetCore也是大势所趋了,基本上以.Net为技术主导的 ...

随机推荐

  1. 银联acp手机支付总结

    总结: 1.手机调用后台服务端接口,获取银联返回的流水号tn 银联支付是请求后台,后台向银联下单,返回交易流水号,然后返回给用户,用户通过这个交易流水号,向银联发送请求,获取订单信息,然后再填写银行卡 ...

  2. SpringMVC注解详情

    @Component.@Repository @Service.@Controller 看字面含义,很容易却别出其中三个: @Controller 控制层,就是我们的action层 @Service ...

  3. React 传值 组件传值 之间的关系

    react 组件相互之间的传值: 传值分父级组件传值给子组件   子组件传值给父组件    平级组件.没有嵌套的组件相互传值 1.父组件向子组件传值 父组件通过属性的形式来向子组件传值,子组件通过pr ...

  4. MFC入门示例之静态文本框、编辑框

    点击按钮计算文本框中文本长度 void CMFCApplication1Dlg::OnBnClickedButton1() { CString strInput; GetDlgItemText(IDC ...

  5. java 整型

    byte(1字节).short(2字节).int(4字节).long(16字节) java中前缀加上0b或者0B就可以写二进制数,前缀加上0就可以写八进制数,前缀加上0x或者0X就可以写十六进制数 一 ...

  6. 阿里云发布CloudOps白皮书,ECS自动化运维套件新升级

    12月10 日,2021云上架构与运维峰会上,阿里云发布业界首部<云上自动化运维白皮书>(简称CloudOps白皮书),并在其中提出了CloudOps成熟度模型.同时,阿里云还宣布了ECS ...

  7. 第45篇-查找native方法的本地实现函数native_function

    在之前介绍为native方法设置解释执行的入口时讲到过Method实例的内存布局,如下: 对于第1个slot来说,如果是native方法,其对应的本地函数的实现会放到Method实例的native_f ...

  8. Android工具 - SQLITE3

    原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6689922 本文章的前提:已经安装了Eclipse和ADT.androi ...

  9. 如何利用火焰图定位 Java 的 CPU 性能问题

     常见 CPU 性能问题 你所负责的服务(下称:服务)是否遇到过以下现象: 休息的时候,手机突然收到大量告警短信,提示服务的 99.9 line 从 20ms 飙升至 10s: 正在敲代码实现业务功能 ...

  10. 微信小程序项目使用npm安装vant-weapp的正确步骤,简单易懂!!

    微信小程序项目使用npm安装vant-weapp的正确步骤 1.在当前小程序项目目录npm init -y 构建npm项目 2.运行命令 npm install vant-weapp -S --pro ...