从0到1搭建权限管理系统系列四 .net8 中Autofac的使用(附源码)
说明
该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。
该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。
说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。
友情提醒:本篇文章是属于系列文章,看该文章前,建议先看之前文章,可以更好理解项目结构。
有兴趣的朋友,请关注我吧(*^▽^*)。

关注我,学不会你来打我
关于Autofac
虽然微软有自带的Ioc框架,但是我想说的是Autofac应该说是我用过的最好的Ioc框架。
它的高性能、灵活性、对Aop的支持,简直就是开发人员的梦中情人。
autofac,它能有效的降低繁杂系统中,代码的耦合度,提高代码的可维护性。
不仅如此,它可以轻松替换依赖关系,从而提高测试效率。
安装Autofac
1、在启动项目中,安装最新版Autofac和Autofac.Extensions.DependencyInjection。
创建类库
1、DomainService:领域服务类
2、Infrastructure:基础设施类
3、CoreDomain:核心领域类
如果你看了该系列每篇文章,你会发现,我们的底层架构,是使用DDD领域驱动模型的设计模式搭建后端。
系统架构如图所示:

搭建好系统架构,我们开始使用Autofac
创建AutofacPlugIn类文件
在系统PlugIn文件中创建AutofacPlugIn类文件,内容如下:
/// <summary>
/// Autofac插件
/// </summary>
public class AutofacPlugIn : Autofac.Module
{
/// <summary>
/// 重写Autofac的Load方法
/// </summary>
/// <param name="containerBuilder"></param>
protected override void Load(ContainerBuilder containerBuilder)
{
//服务项目程序集
Assembly service = Assembly.Load("DomainService");
Assembly intracface = Assembly.Load("Infrastructure"); //项目必须以xxx结尾
containerBuilder.RegisterAssemblyTypes(service).Where(n => n.Name.EndsWith("Service") && !n.IsAbstract)
.InstancePerLifetimeScope().AsImplementedInterfaces();
containerBuilder.RegisterAssemblyTypes(intracface).Where(n => n.Name.EndsWith("Repository") && !n.IsAbstract)
.InstancePerLifetimeScope().AsImplementedInterfaces(); } }
代码解释:
获取DomainService和Infrastructure程序集,然后批量注入。
值得注意的是,我们在创建类时,给了限定条件。那就是程序集下面的类,必须以Service和Repository结尾,否则autofac会抛出错误。
当然有以xxx结尾,那必然有以xxx开头。使用StartsWith轻松解决。
在Program组成Autofac
.net8 autofac注册和以往有点出去,需要在Program中添加如如下代码
var builder = WebApplication.CreateBuilder(args);
//自定义Autofac中间件
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()).ConfigureContainer<ContainerBuilder>(builder =>
{
builder.RegisterModule<AutofacPlugIn>();
});
经过以上配置,autofac已经配置好,是不是很简单,接下来测试一下。
使用
在Infrastructure类中建立ISysUserRepository和SysUserRepository仓储接口及接口实现
结构如下:

内容代码如下:
ISysUserRepository
/// <summary>
/// 用户服务仓储接口
/// </summary>
public interface ISysUserRepository
{
/// <summary>
/// 测试Autofac
/// </summary>
/// <returns></returns>
string TestAutofac();
}
SysUserRepository
/// <summary>
/// 用户服务仓储接口实现
/// </summary>
public class SysUserRepository : ISysUserRepository
{
/// <summary>
/// 测试Autofac
/// </summary>
/// <returns></returns>
public string TestAutofac()
{
return "Autofac使用成功";
}
}
在DomainService中创建ISysUserService和SysUserService服务接口和实现
结构如下:

内容代码如下
ISysUserService
/// <summary>
/// 用户服务接口
/// </summary>
public interface ISysUserService
{
/// <summary>
/// 测试Autofac
/// </summary>
/// <returns></returns>
string TestAutofac();
}
SysUserService
/// <summary>
/// 用户服务接口实现
/// </summary>
public class SysUserService : ISysUserService
{
#region 构造实例化 private readonly ISysUserRepository _sysUserRepository; public SysUserService(ISysUserRepository sysUserRepository)
{
_sysUserRepository = sysUserRepository;
} #endregion /// <summary>
/// 测试Autofac
/// </summary>
/// <returns></returns>
public string TestAutofac()
{
return _sysUserRepository.TestAutofac();
}
}
测试
在SysUserController控制器中调用接口(该控制器,在之前文章中已经建好,没看之前文章的,随意见一个webapi的控制器也行)。
代码如下:
#region 构造实列化 /// <summary>
/// 用户服务
/// </summary>
public ISysUserService _userService; /// <summary>
/// 构造函数
/// </summary>
/// <param name="userService"></param>
public SysUserController(ISysUserService userService)
{
_userService = userService;
} #endregion /// <summary>
/// 获取Token
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="password">密码</param>
[HttpGet]
[AllowAnonymous]
public string GetToken(string userName, string password)
{
var loginResult = JwtPlugIn.BuildToken(new LoginInput { UserName = userName, Password = password }); return loginResult.Token ?? string.Empty;
} /// <summary>
/// 测试Autofac
/// </summary>
/// <returns></returns>
[HttpGet]
[AllowAnonymous]
public string TestAutofac()
{
return _userService.TestAutofac();
}
上述代码中要先通过Autofac来实例化接口。
打开swagger,开始测试

之前说道,我们的接口必须以xxx结束,那么现在我们把这个约定改一下,看能否调用成功。
修改代码如下:
/// <summary>
/// 重写Autofac的Load方法
/// </summary>
/// <param name="containerBuilder"></param>
protected override void Load(ContainerBuilder containerBuilder)
{
//服务项目程序集
Assembly service = Assembly.Load("DomainService");
Assembly intracface = Assembly.Load("Infrastructure"); //项目必须以xxx结尾
containerBuilder.RegisterAssemblyTypes(service).Where(n => n.Name.EndsWith("Service111111111") && !n.IsAbstract)
.InstancePerLifetimeScope().AsImplementedInterfaces();
containerBuilder.RegisterAssemblyTypes(intracface).Where(n => n.Name.EndsWith("Repository2222222") && !n.IsAbstract)
.InstancePerLifetimeScope().AsImplementedInterfaces(); }
可以看到,我们把以Service、Repository结束改成了Service111111111、Repository2222222,也就是说,我们的领域服务类和基础仓储类是不符合改命名规范的,aufofac应该报出错误。
测试:

以上就是aufofac在本期内容中的使用。
在接下来的系列中,会使用autofac+aop的结合使用,有兴趣的朋友,请博客园关注、微信关注,感谢观看。
源代码地址:https://gitee.com/yangguangchenjie/overall-auth2.0-web-api
帮我Star,谢谢。
有兴趣的朋友,请关注我微信公众号吧(*^▽^*)。

关注我:一个全栈多端的宝藏博主,定时分享技术文章,不定时分享开源项目。关注我,带你认识不一样的程序世界
从0到1搭建权限管理系统系列四 .net8 中Autofac的使用(附源码)的更多相关文章
- openlayers5-webpack 入门开发系列结合 turf.js 实现等值线(附源码下载)
前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...
- openlayers4 入门开发系列之地图空间查询篇(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- arcgis api 3.x for js 入门开发系列二十二地图模态层(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- openlayers4 入门开发系列之地图模态层篇(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- openlayers4 入门开发系列之地图标绘篇(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- openlayers4 入门开发系列之地图属性查询篇(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- arcgis api 3.x for js 入门开发系列二不同地图服务展示(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- arcgis api 3.x for js 入门开发系列十八风向流动图(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- arcgis api 3.x for js 入门开发系列十四最近设施点路径分析(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- arcgis api 3.x for js 入门开发系列十二地图打印GP服务(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
随机推荐
- 解锁Nginx日志的宝藏:GoAccess——你的实时、交互式Web日志分析神器!
在当今数字化的时代,网站的流量和用户行为数据就像是一座蕴藏着无尽秘密的宝藏.而如何有效地挖掘和分析这些数据,成为了许多网站管理者和开发者头疼的问题.GoAccess,一款开源的实时Web日志分析工具, ...
- 辅助分类器生成对抗网络( Auxiliary Classifier Generative Adversarial Network,ACGAN)(附带pytorch代码)
1 ACGAN基本原理 1.2 ACGAN模型解释 ACGAN相对于CGAN使的判别器不仅可以判别真假,也可以判别类别 .通过对生成数据类别的判断,判别器可以更好地传递loss函数使得生成器能够更加准 ...
- 手把手教你本地运行Meta最新大模型:Llama3.1,可是它说自己是ChatGPT?
就在昨晚,Meta发布了可以与OpenAI掰手腕的最新开源大模型:Llama 3.1. 该模型共有三个版本: 8B 70B 405B 对于这次发布,Meta已经在超过150个涵盖广泛语言范围的基准数据 ...
- 微服务:nacos服务注册与发现
服务治理的三个角色: 服务提供者:订阅服务 服务消费者:注册服务 注册中心:记录与监控服务状态,推送服务变更信息.提供者定时发送心跳检测,心跳检测失败,就会向消费者推送变更 提供者通过负载均衡的算法选 ...
- sharding-jdbc 兼容 MybatisPlus的动态数据源
背景:之前的项目做读写分离的时候用的 MybatisPlus的动态数据做的,很多地方使用的@DS直接指定的读库或者写库实现的业务:随着表数据量越来越大,现在打算把比较大的表进行水平拆分,准备使用 Sh ...
- 【Vue】el-select 数据过多替代方案
一.需求问题: 一开始就考虑使用简单el-select选取数据,但是后面数据量增多, 超过一千条开始,组件会很卡不好用,第二个是接口也慢了 数据量多的话是有一个filterable做支持了,可以输入关 ...
- 【Tutorial C】08 函数 Function
函数的定义 C源程序是由函数组成的. 最简单的程序有一个主函数 main(),但实用程序往往由多个函数组成, 由主函数调用其他函数,其他函数也可以互相调用. 函数是C源程序的基本模块,程序的许多功能是 ...
- Continue-AI编程助手本地部署llama3.1+deepseek-coder-v2
领先的开源人工智能代码助手.您可以连接任何模型和任何上下文,以在 IDE 内构建自定义自动完成和聊天体验 推荐以下开源模型: 聊天:llama3.1-8B 推理代码:deepseek-coder-v2 ...
- 如何使用H100打游戏——这是史上最快GPU!我们测了四张H100!价值120万元!
资料: 这是史上最快GPU!我们测了四张H100!价值120万元! 对显卡H100的测评视频.
- 如何租GPU:一个价格还算OK的云GPU服务器租赁公司
一个价格还算OK的云GPU服务器租赁公司. 地址: https://www.gpushare.com/