前置

工具

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. Shell学习(四)——shell中各种括号的作用

    参考博客: [1]shell中各种括号的作用().(()).[].[[]].{} [2]shell中的单层大/中/小括号.双层大中小括号.命令替换等 一.前言 目录 单括号() 双括号(( )) 单中 ...

  2. Win7部署Yapi

    1.安装node 下载地址:https://nodejs.org/zh-cn/download/ (win7要下载v12.16之前的版本) 安装目录在D:\nodejs,配置地址(文件目录不能有特殊符 ...

  3. C++ 类型转换(C风格的强制转换):

    转https://www.cnblogs.com/Allen-rg/p/6999360.html C++ 类型转换(C风格的强制转换): 在C++基本的数据类型中,可以分为四类:整型,浮点型,字符型, ...

  4. Give You My Best Wishes

    亲耐滴IT童鞋们: 感谢大家一直以来的支持,因为有你们的支持,才有我这么"拼"的动力!!爱你们哟 OC的学习已经告一段落,希望大家通过阅读这几篇浅薄的随笔,能够寻找到解决问题的方法 ...

  5. SVN终端演练-版本回退

    1. 版本回退概念以及原因?    概念: 是指将代码(本地代码或者服务器代码), 回退到之前记录的某一特定版本    原因: 如果代码做错了, 想返回之前某个状态重做;2. 修改了,但未提交的情况下 ...

  6. C# 使用管理员权限运行程序

    最近在开发OPCServer组件过程中,在注册opcServer是总是返回false,后来查找原因得知在本地主机注册opcServer时,需要使用管理员权限. OPCServer在一台机器上部署时只需 ...

  7. Java分层思想

    从最常规的分层结构来说,系统层次从上到下依次为: 表现层/UI层/界面层:主要是客户端的展示. 服务层/业务层:直接为客户端提供的服务或功能.也是系统所能对外提供的功能. 领域层:系统内的领域活动. ...

  8. Jenkins获取jar包的快照号

    目录 一.简介 二.脚本 一.简介 主要用于打jar包的工程,显示快照包的名字.当jar打包完成后,会在target目录中,截取快照名. 二.脚本 1.脚本return-version.sh #!/b ...

  9. 【划重点】Python xlrd简介

    一.用xlrd获取对应数据,并获取所有sheet的名字 import xlrd data=xlrd.open_workbook(r'C:\Users\ASUS\Desktop\重新开始\Python获 ...

  10. <转>Android多线程总结

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://yuchen.blog.51cto.com/2739238/593019 --An ...