说明

该文章是属于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的使用(附源码)的更多相关文章

  1. openlayers5-webpack 入门开发系列结合 turf.js 实现等值线(附源码下载)

    前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...

  2. openlayers4 入门开发系列之地图空间查询篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  3. arcgis api 3.x for js 入门开发系列二十二地图模态层(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  4. openlayers4 入门开发系列之地图模态层篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  5. openlayers4 入门开发系列之地图标绘篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  6. openlayers4 入门开发系列之地图属性查询篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  7. arcgis api 3.x for js 入门开发系列二不同地图服务展示(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  8. arcgis api 3.x for js 入门开发系列十八风向流动图(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  9. arcgis api 3.x for js 入门开发系列十四最近设施点路径分析(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  10. arcgis api 3.x for js 入门开发系列十二地图打印GP服务(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

随机推荐

  1. MySQL 跨服务器关联查询

    如果您需要在 MySQL 中关联查询位于不同服务器的表(跨服务器关联查询),您可以考虑使用 MySQL 的联机查询(Federated MySQL).联机查询允许您在一个服务器上访问和查询另一个服务器 ...

  2. java面试一日一题:说下mysql中的binlog

    问题:请讲下mysql中的binlog 分析:该问题主要考察对mysql中binlog的理解及使用场景? 回答要点: 主要从以下几点去考虑, 1.什么是binglog? 2.binlog的使用场景是什 ...

  3. windows上传app到构建版本的方法

    ios打包好ipa文件后,ipa文件需要上架到app store,用户才能安装.而在app store里,无法直接将ipa上传,需要使用工具上传,但是官方提供的工具,比如xcode等只能安装在苹果电脑 ...

  4. 一个基于 SourceGenerator 生成 从 dbReader转换为 class 数据的性能测试实验

    好奇 SourceGenerator 出现开始,好几年了,虽然一直好奇用SourceGenerator 生成代码 与 emit 等动态生成的代码会有多少差距, 但是一直特别懒,不想搞 其实 dappe ...

  5. 【Eclipse】下载安装(Windows)

    Eclipse的下载和安装 官网地址:https://www.eclipse.org/downloads/ 刚用的时候选了安装版,然后安装到一半就失败了 建议点下面的解压包下载,解压即用 注意看框线的 ...

  6. 报错 qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in ““ even though it was found

    参考: https://blog.csdn.net/qq_39938666/article/details/120452028 ==================================== ...

  7. C#开发的全屏图片切换效果应用 - 开源研究系列文章 - 个人小作品

    这天无聊,想到上次开发的图片显示软件< PhotoNet看图软件 >,然后想到开发一个全屏图片切换效果的应用,类似于屏幕保护程序,于是就写了此博文.这个应用比较简单,主要是全屏切换换图片效 ...

  8. 充分利用HarmonyOS NEXT:开发者的全功能指南

    随着技术的不断进步,开发者们面临着如何在复杂的技术环境中创造出卓越应用的挑战.在当今的科技浪潮中,如何抓住创新的机遇?HarmonyOS NEXT的发布,带来了全新的机遇和功能.本文将探讨开发者如何充 ...

  9. 最详细STL(三)list

    list就是链表啦,他的一个结点由两个指针域,一个数据域组成.list可以在任何位置以O(n)的复杂度插入元素,头部和尾部的插入的复杂度为O(1).然而list也有一个致命的缺点,因为链表的空间申请是 ...

  10. 使用了 sudo 却依然显示权限不够的原因

    $ sudo echo "151.101.76.133 raw.githubusercontent.com" >> /etc/hosts bash: /etc/host ...