首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

肉夹馍(Rougamo)4.0.1 异步方法变量调试修复与IoC系列扩展

编程知识
2024年09月02日 13:43

肉夹馍(https://github.com/inversionhourglass/Rougamo),一款编译时AOP组件,无需在应用启动时进行初始化,也无需繁琐的配置;支持所有种类方法(同步和异步、静态和实例、构造方法/属性/普通方法);提供了简单易上手的Attribute应用方式,同时还提供了类AspectJ表达式的批量应用规则。

4.0.1 更新内容

4.0版本发布的文章评论 中,有朋友反馈了一个调试时无法查看方法内部变量值的问题。本次更新就是修复这个问题的,4.0.1不包含其他修改,对调试时禁用肉夹馍的朋友没有任何影响,可以酌情升级。

肉夹馍IoC/DI扩展

4.0.1本来是不准备发博客的,内容一句话就结束了,不过又想到前段时间还发布了IoC扩展,索性就合在一起写一篇博客吧。

各位在使用肉夹馍时,最常遇到的问题可能就是如何与IoC交互了。现在主流的动态代理本身就需要IoC才能完成,所以动态代理在IoC交互方面具有天然的优势,而肉夹馍编译时完成不依赖IoC,所以与IoC的交互也不是很方便。但不方便并不是不能。此前已经有朋友在自己的项目中实现了IoC的访问,比如Rougamo.OpenTelemetry, FreeSql。考虑到IoC的使用在现在已经非常普遍,所以新增了几个常用IoC的扩展包。

目前只对最常用的两个IoC组件提供了支持,一个是微软官方的Microsoft.Extensions.DependencyInjection,另一个是Autofac,主要包含四个NuGet:

  • Rougamo.Extensions.DependencyInjection.AspNetCore
  • Rougamo.Extensions.DependencyInjection.GenericHost
  • Rougamo.Extensions.DependencyInjection.Autofac.AspNetCore
  • Rougamo.Extensions.DependencyInjection.Autofac

其中AspNetCore结尾的两个NuGet专用于AspNetCore(废话了哦),另外两个NuGet用于通用主机(Generic Host)和Framework等场景。

版本号说明

在引用这些NuGet包时,你会发现他们都包含很多个版本,这并不是版本迭代更新快或者版本号设置错了导致的,版本号有相应的规则,它们的主版本号跟随对应IoC组件的NuGet主版本号。微软官方的两个扩展包的主版本号跟随Microsoft.Extensions.*的主版本号(也是.NET SDK的版本),Autofac的两个扩展包的主版本号跟随Autofac的主版本号。

快速开始

下面直接用代码快速展示如何使用对应的扩展包。

Rougamo.Extensions.DependencyInjection.AspNetCore

// 注册Rougamo(注:如果你不使用IoC/DI功能,Rougamo默认是不需要注册操作的)
public static void Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);
    // ...省略其他步骤
    builder.Services.AddRougamoAspNetCore();
    // ...省略其他步骤
}

// 在切面类型中获取IServiceProvider实例并使用
public class TestAttribute : MoAttribute
{
    public override void OnEntry(MethodContext context)
    {
        // 使用扩展方法GetServiceProvider获取IServiceProvider实例
        var services = context.GetServiceProvider();

        // 使用IServiceProvider
        var xxx = services.GetService<IXxx>();
    }
}

Rougamo.Extensions.DependencyInjection.GenericHost

// 注册Rougamo(注:如果你不使用IoC/DI功能,Rougamo默认是不需要注册操作的)
public static void Main(string[] args)
{
    var builder = Host.CreateDefaultBuilder();
    // ...省略其他步骤
    builder.ConfigureServices(services => services.AddRougamoGenericHost());
    // ...省略其他步骤
}

// 在切面类型中获取IServiceProvider实例并使用
public class TestAttribute : MoAttribute
{
    public override void OnEntry(MethodContext context)
    {
        // 使用扩展方法GetServiceProvider获取IServiceProvider实例
        var services = context.GetServiceProvider();

        // 使用IServiceProvider
        var xxx = services.GetService<IXxx>();
    }
}

Rougamo.Extensions.DependencyInjection.Autofac.AspNetCore

// 注册Rougamo(注:如果你不使用IoC/DI功能,Rougamo默认是不需要注册操作的)
public static void Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);
    builder.Host
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureContainer<ContainerBuilder>(builder =>
            {
                builder.RegisterRougamoAspNetCore();
            });
    
    // 注册IHttpContextAccessor也是必须的
    builder.Services.AddHttpContextAccessor();
}

// 在切面类型中获取ILifetimeScope实例并使用
public class TestAttribute : MoAttribute
{
    public override void OnEntry(MethodContext context)
    {
        // 使用扩展方法GetAutofacCurrentScope获取ILifetimeScope实例
        var scope = context.GetAutofacCurrentScope();

        // 使用ILifetimeScope
        var xxx = scope.Resolve<IXxx>();
    }
}

Rougamo.Extensions.DependencyInjection.Autofac

// 注册Rougamo(注:如果你不使用IoC/DI功能,Rougamo默认是不需要注册操作的)
public static void Main(string[] args)
{
    var builder = Host.CreateDefaultBuilder();
    
    builder
        .UseServiceProviderFactory(new AutofacServiceProviderFactory())
        .ConfigureContainer<ContainerBuilder>(builder =>
        {
            builder.RegisterRougamo();
        });
}

// 在切面类型中获取IServiceProvider实例并使用
public class TestAttribute : MoAttribute
{
    public override void OnEntry(MethodContext context)
    {
        // 使用扩展方法GetAutofacCurrentScope获取ILifetimeScope实例
        var scope = context.GetAutofacCurrentScope();

        // 使用ILifetimeScope
        var xxx = scope.Resolve<IXxx>();
    }
}

比较早的Framework项目以及WinForm、WPF等项目可能并没有使用通用主机(Generic Host),此时使用Rougamo.Extensions.DependencyInjection.Autofac将更加直接,初始化时创建ContainerBuilder后直接调用RegisterRougamo扩展方法即可。

var builder = new ContainerBuilder();
builder.RegisterRougamo();

更多

肉夹馍IoC/DI扩展更多的信息请访问 Rougamo.DI (https://github.com/inversionhourglass/Rougamo.DI),欢迎反馈建议和提交PR.

From:https://www.cnblogs.com/nigture/p/18390997
本文地址: http://shuzixingkong.net/article/1665
0评论
提交 加载更多评论
其他文章 租约机制详解
概述 租约机制指在租约期限内,拥有租约的节点有权利操作一些预设好的对象,具体如下 租约是由授权者授予的一段时间内的承诺 授权者一旦发出租约,则无论接受方是否收到,也无论后续接收方处于何种状态,只要租约不过期,授权者就得遵守承诺,按承诺的时间和内容执行。 接收方在有效期内可以使用授权者的租约,如果租约
OpenCV开发笔记(八十):基于特征点匹配实现全景图片拼接
前言 一个摄像头视野不大的时候,我们希望进行两个视野合并,这样让正视的视野增大,从而可以看到更广阔的标准视野。拼接的方法分为两条路,第一条路是Sticher类,第二条思路是特征点匹配。 本篇使用特征点匹配,进行两张图来视野合并拼接。 Demo 100%的点匹配 换了一幅图: 所以,opencv传统的
OpenCV开发笔记(八十):基于特征点匹配实现全景图片拼接 OpenCV开发笔记(八十):基于特征点匹配实现全景图片拼接 OpenCV开发笔记(八十):基于特征点匹配实现全景图片拼接
LaViT:这也行,微软提出直接用上一层的注意力权重生成当前层的注意力权重 | CVPR 2024
Less-Attention Vision Transformer利用了在多头自注意力(MHSA)块中计算的依赖关系,通过重复使用先前MSA块的注意力来绕过注意力计算,还额外增加了一个简单的保持对角性的损失函数,旨在促进注意力矩阵在表示标记之间关系方面的预期行为。该架构你能有效地捕捉了跨标记的关联,
LaViT:这也行,微软提出直接用上一层的注意力权重生成当前层的注意力权重 | CVPR 2024 LaViT:这也行,微软提出直接用上一层的注意力权重生成当前层的注意力权重 | CVPR 2024 LaViT:这也行,微软提出直接用上一层的注意力权重生成当前层的注意力权重 | CVPR 2024
写在临近四十岁的年龄
人生有那么一首诗,往往当你拥有他的时候,你没有读懂他,可是当你读懂他的时候,你却失去了他,这首诗就是青春。“一寸光阴一寸金,寸金难买寸光阴”,学生时代的作文中,已经被我们用烂了的词汇,时至今日,终于才深刻理解这句话的重要意义。光阴的确是无价的,一旦错过却无法追回,一寸光阴又何止一寸金呢。古人说过“三
HTB-Runner靶机笔记
HTB-Runner靶机笔记 概述 Runner是HTB上一个中等难度的Linux靶机,它包含以下teamcity漏洞(CVE-2023-42793)该漏洞允许用户绕过身份验证并提取API令牌。以及docker容器逃逸CVE-2024-21626,进行提权操作 Runner靶机地址:https://
HTB-Runner靶机笔记 HTB-Runner靶机笔记 HTB-Runner靶机笔记
MySQL服务端innodb_buffer_pool_size配置参数
innodb_buffer_pool_size是什么? innodb_buffer_pool是 InnoDB 缓冲池,是一个内存区域保存缓存的 InnoDB 数据为表、索引和其他辅助缓冲区。innodb_buffer_pool_size 是这个缓冲池的大小,默认128M(即134217728 byt
ECharts实现雷达图详解
ECharts 是一款由百度开源的数据可视化工具,它提供了丰富的图表类型,如折线图、柱状图、饼图、散点图、雷达图、地图、K线图、热力图、仪表盘等,以及丰富的交互功能。ECharts 组件的核心功能实现原理主要包括以下几个方面: 数据驱动: ECharts 采用数据驱动的设计理念,图表的生成和更新都是
ECharts实现雷达图详解 ECharts实现雷达图详解
Spring框架之IOC介绍
Spring之IOC 简介 首先,官网中有这样一句话:Spring Framework implementation of the Inversion of Control (IoC) principle.这句话翻译过来就是:Spring实现控制反转(IOC)原理,由此可以得出,Inversion