从0到1搭建权限管理系统系列四 .net8 中Autofac的使用(附源码)

news/2024/9/29 16:46:51

说明

    该文章是属于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,谢谢。

有兴趣的朋友,请关注我微信公众号吧(*^▽^*)。

关注我:一个全栈多端的宝藏博主,定时分享技术文章,不定时分享开源项目。关注我,带你认识不一样的程序世界

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66222.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

React周视图组件封装

技术栈:React、antd需求背景 使用周视图来显示广播信息与状态 组件特点当多个广播时间段交叠时,并行显示。对于交叠广播,最多显示3个,如果要显示全部交叠的广播,可点击展开。 可对时间段精度进行扩展。当多个时间短但不重叠的广播放在一起时,更方便看。 支持点击回到本周…

【问题解决】win10日志错误:创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013

背景 最近win10死机了一次,查看事件管理器发现有大量的报错:“创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013”,如图:解决 win键搜索internet选项原因 参考错误:“ 创建 TLS 客户端凭据时发生致命错误。 内部错误状态为 10013”的说法是win10对TLSv3.0兼容性…

2024-2025-1 20241415 《计算机基础与程序设计》第1周学习总结

这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))这个作业要求在哪里 2024-2025-1计算机基础与程序设计第一周作业这个作业的目标 阅读浏览教材《计算机科学概论》,加深对计算机科学的理解,提高自学能力,学…

Prism 行为处理

Prism框架提供了DelegateCommand类型,专门用于进行WPF中的行为处理。 基本使用一、命令的使用DelegateCommand(Action executeMethod):DelegateCommand的构造函数,创建DelegateCommand对象。 executeMethod:无参的命令执行函数。定义命令public class MainViewModel {publi…

南沙C++信奥赛老师解一本通题1217:棋盘问题

​【题目描述】在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 kk 个棋子的所有可行的摆放方案 CC。【输入】输入含有多组测试数据。 每组数据…

文件传输 --- 使用 FTP 在两个主机之前传输文件

FTP 客户端 服务端tcpsvd -vE 0.0.0.0 21 ftpd /app/updater/ -w &共享 /app/updater 的文件给客户端

高可用集群 KEEPALIVED ubuntu使用

1 Keepalived 架构和安装 2.1 Keepalived 架构 Keepalived进程树Keepalived <-- Parent process monitoring children \_ Keepalived <-- VRRP child \_ Keepalived <-- Healthchecking child2.2 Keepalived 环境准备 #环境准备 #两台keepalive机器分别配一个单独网卡…

PHP支付,TP5.0接入支付宝支付流程

一、支付宝沙箱 1.登录支付宝开放平台https://open.alipay.com/;点击右上角的“控制台”菜单 2.下拉到页末找到“沙盒” 配置一下基础信息:配置一下信息,特别注意,网关地址:沙箱环境是有dev的,正式上要去掉 dev; 二、DEMO 1.下载电脑网站支付Demo php版本 2.下载后把整…