ETJava Beta | Java    注册   登录
  • 搜索:
  • 从0到1搭建权限管理系统系列四 .net8 中Autofac的使用(附源码)

    发表于      阅读(1)     博客类别:Crawler     转自:https://www.cnblogs.com/cyzf/p/18439606
    如有侵权 请联系我们删除  (页面底部联系我们)  

    说明

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

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

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