IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> C#中以及NetCore中使用Autofac完全基于特性的方式完成依赖注入 -> 正文阅读

[开发工具]C#中以及NetCore中使用Autofac完全基于特性的方式完成依赖注入

基于特性的方式结合Autofac第三方容器来完成对类的依赖注入。在这里你只需要在你的代码里面进行最简单的配置,然后只需要使用一个特性,或者不使用任何特性就能够完成注入类的实例。你可以在c#相关项目中,也可以在c#的基于netcore的项目中完成这样的事情。由于本人是以netcore开发项目,这里就以最新的net6.0项目作为使用讲解。当然这里也会提到在非netcore项目中集成自动注入的代码段。
如果你看完后觉得这个还行还可以还比较好,你可以在Nuget上通过搜索OpenDeepSpace.Autofac.AutomaticInjection引用到你自己的项目中进行使用。
废话不多说,懂的都懂,直接开整,上代码!!!

集成Autofac自动注入

在非NetCore项目中集成

ContainerBuilder builder=new ContainerBuilder();//构造一个ContainerBuilder
builder.UseAutomaticInjection(new List<OpenDeepSpace.Autofac.AutomaticInjection.Ioc.AutomaticInjectionSelector>() { 
           
    });//这里有一个自动注入选择器集的可选配置项 这个意思就是满足这些条件的类下面的属性以及字段都会被自动注入不需要打任何特性

通过这样简单的两句话就完成了集成就可以通过特性自动注入开整了

在NetCore项目中集成

如果要在Controller中使用自动注入需要添加这样一句话即把Contoller作为Service,非常重要,这里我直接写到前面。

builder.Services.AddControllers().AddControllersAsServices();

集成方式一

这里我是以Net6.0为例子

builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
{
    //可以传入一个参数List<AutomaticInjectionSelector>自动注入筛选集 表示符合条件的类将主动完成对属性以及字段的注入
    builder.UseAutomaticInjection(new List<OpenDeepSpace.Autofac.AutomaticInjection.Ioc.AutomaticInjectionSelector>() { 
            //Controller下面的都自动注入
            new OpenDeepSpace.Autofac.AutomaticInjection.Ioc.AutomaticInjectionSelector(t=>t.BaseType==typeof(ControllerBase))
    });

	//单接口多实现的注入 如果要使用ImplementationType来指定解析某一个实现类 需要按照下面的方式注入 以Keyed的方式 把实现类的FullName作为key
    //这里你可以考虑批量注入 目前暂未实现 后续将进一步实现
    builder.RegisterType<ServiceOne>().AsSelf().As<IServiceOne>().Keyed<IServiceOne>(typeof(ServiceOne).FullName);
    builder.RegisterType<ServiceOneUpdate>().AsSelf().As<IServiceOne>().Keyed<IServiceOne>(typeof(ServiceOneUpdate).FullName);
}).UseServiceProviderFactory(new AutofacServiceProviderFactory());

集成方式二

使用这种方式 如果你使用NetCore原有的依赖注入AddTransient/AddScoped/AddSingleton,如果存在一个接口多个实现的情况,会自动将实现类FullName作为Keyed的键注入到Autofac中,直接达到单接口多实现。

builder.Host.UseAutofac(new List<AutomaticInjectionSelector>()
{
    //Controller下面的都自动注入
            new OpenDeepSpace.Autofac.AutomaticInjection.Ioc.AutomaticInjectionSelector(t=>t.BaseType==typeof(ControllerBase))
});

使用特性完成自动注入

这里有两个特性一个是AutomaticInjectionAttribute表示自动注入
一个是NonAutomaticInjectionAttribute表示不自动注入。
首先我们说第一个特性自动注入:
AutomaticInjectionAttribute可以使用在类上/属性上/字段上
当使用在类上时,该类下面的所有属性和字段都将被注入

属性说明
ImplementationType指定实现类将解析该类作为实例,用于单接口多实现的情况

然后再说第二个特性不自动注入:
NonAutomaticInjectionAttribute该特性使用在类上/属性上/字段上
该特性一般结合自动注入筛选集以及当AutomaticInjectionAttribute使用在类上是,用来标注某些类/属性/字段不使用自动注入

使用特性完成自动注入例子

/// <summary>
    /// 自动注入测试控制器
    /// </summary>
    [ApiController]
    [Route("[controller]/[action]")]
    //[AutomaticInjection]
    //[NonAutomaticInjection]
    public class AutomaticInjectionController : ControllerBase
    {
        //[AutomaticInjection]
        private readonly ILogger<AutomaticInjectionController> logger;

        //[AutomaticInjection]
        [NonAutomaticInjection]
        private ILogger<AutomaticInjectionController> logger2 { get; set; }

        [AutomaticInjection(ImplementationType = typeof(IOptions<MvcOptions>))]
        private MvcOptions _mvcOptions;


        private readonly ILogger<AutomaticInjectionController> originLogger;

        [AutomaticInjection(ImplementationType = typeof(ServiceOneUpdate))]
        private readonly IServiceOne serviceOne;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="originLogger"></param>
        public AutomaticInjectionController(ILogger<AutomaticInjectionController> originLogger)
        {
            this.originLogger = originLogger;
        }

        /// <summary>
        /// 测试自动注入
        /// </summary>
        [HttpGet]
        public void TestAutomaticInjection()
        {
            serviceOne.Op();
        }
        
    }
    
[AutomaticInjection]
    public class ServiceOne : IServiceOne
    {
        
        public readonly ILogger<ServiceOne> logger;

        public void Op()
        {
            logger.LogInformation($"{typeof(ServiceOne)} Op");
        }
    }

public class ServiceOneUpdate : IServiceOne
    {
        [AutomaticInjection]
        private readonly ILogger<ServiceOneUpdate> logger;

        public void Op()
        {
            logger.LogInformation($"{typeof(ServiceOneUpdate)} Op");
        }
    }

在不能使用自动注入下获取实例

在NetCore项目中

IocManager.InitContainer(app.Services.GetAutofacRoot());

以NetCore的Filter为例

public class ActionCheckFilter : IAsyncActionFilter
    {
        private MvcOptions mvcOptions=>IocManager.Resolve<IOptions<MvcOptions>>().Value;
        private IServiceProvider serviceProvider => IocManager.Resolve<IServiceProvider>();

        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            await next();

            await Task.CompletedTask;    
        }
    }

通过以上的一顿配置注入的操作接下来简单的看一下结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

批量注入

暂未实现准备实现

Aop切面

暂未实现准备实现

在使用过程中欢迎给位提出宝贵的意见,我将进一步改进

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-05-25 11:41:27  更:2022-05-25 11:41:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:31:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码