说明
该文章是属于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,谢谢。
有兴趣的朋友,请关注我微信公众号吧(*^▽^*)。
关注我:一个全栈多端的宝藏博主,定时分享技术文章,不定时分享开源项目。关注我,带你认识不一样的程序世界