从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,谢谢。

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

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

相关推荐
RuoyiOffice4 天前
SpringBoot3+Vue3 最推荐的开源 OA 系统 2026:流程驱动、资源闭环、多端互通
spring boot·vue3·flowable·oa·协同办公·spring boot 3·开源oa
桔子雨4 天前
轻量,再轻量:当 PicoServer 遇上 SimdPaddleOCR
webapi·picoserver·轻量web框架
鱼与宇5 天前
Element-plus离线访问(适用内网)
elementui·vue3
我就是DaLing呀!7 天前
vue3 + 独立的数据管理 Store实现视频剪辑功能
前端·typescript·vue3·canvas·store
我才是银古9 天前
当 360° 全景遇上真实地图:Vue 3 实现全景-地图双向联动的工程实践
3d·vue3·360影像
XLYcmy11 天前
HTML/CSS/JS 基础与 Vue 技术栈深度解析
java·前端·css·html·vue3·vue2·api
厦门德仔11 天前
【YiFeiWebApi】易飞ERP接口开发踩坑实录(避坑指南)
webapi·易飞·开放指南
码视野13 天前
基于 Spring Boot + Vue3 的【大学英语四六级 (CET-4/6) 作文智能评分与句式润色系统】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端·vue3
码视野14 天前
基于 Spring Boot + Vue3 的【高校化学实验室安全准入考试与危化品配伍排查系统】设计与实现(含PRD/三端高保真源码/大屏)
前端·人工智能·spring boot·后端·安全·vue3
fxshy14 天前
WebGIS 游戏化实践:基于 Cesium + Vue3 实现全球飞行模拟系统:从球体坐标、飞行动力学到地形碰撞实战
游戏·vue3·cesium·webgis·飞行模拟