肉夹馍(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.

肉夹馍(Rougamo)4.0.1 异步方法变量调试修复与IoC系列扩展的更多相关文章

  1. 利用Visual Studio Natvis 框架简化C++的变量调试工作

    相信用C++开发过UI界面的程序员都对其变量调试工作头痛不已,由于复杂的继承关系,要查看到某个变量往往需要一系列的层层深入的点击,如下图就是查看TextBox的Text的例子: 为了查看Text属性, ...

  2. vue cli4.0 配置环境变量

    温馨提示:本文只适用于vue-cli 3.0 及以上的版本哦~ ------------------正文开始------------------ 开发项目时,经常会需要在不同环境中切换.那么我们如何配 ...

  3. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列。开源啦!!!

    自此系列博客开写以来,好多同学关心开源问题,之前由于网络问题,发布到Github上老是失败,今天终于在精简了好多无用的文件之后发布上去了. 注意:layim源代码并不开源,由于版权问题,请大家去官网了 ...

  4. HBase2.0 meta信息丢失的修复方法

    在HBase入库日志中发现有一个表入库失败,检查HBase服务端后发现该表的meta信息丢失了: 而HDFS上的region还在: 而HBCK工具不支持HBase2.0版本,只好自己写一个修复工具.网 ...

  5. 配置Windows 2008 R2 64位 Odoo 8.0/9.0 源码开发调试环境

    安装过程中,需要互联网连接下载python依赖库: 1.安装: Windows Server 2008 R2 x64标准版 2.安装: Python 2.7.10 amd64 到C:\Python27 ...

  6. phpStorm9.0 +xampp+chrome php调试环境配置!

    不多说,直接上step by step: 1.xampp配置 看看我的XAMPP版本: 修改配置文件,该打开打开,该加上加上,结果如下(当前需要重新启动apache,配置才会生效): [XDebug] ...

  7. thjinkphp 变量调试

    输出某个变量是开发过程中经常会用到的调试方法,除了使用php内置的var_dump和print_r之外,ThinkPHP框架内置了一个对浏览器友好的dump方法,用于输出变量的信息到浏览器查看. 大理 ...

  8. .net妹纸转Java---java环境的搭建,myeclipse10.0 的安装环境变量配置和破解

    啦啦啦 ,因为公司项目需要,从我大火炉--大武汉被拖到了更大的火炉--大广西  其实一开始 我的内心是拒绝的. 但是我在大武汉呆了近2年木有出过远门,对, 生活除了眼前的苟且,还有远方的苟且.怀揣这样 ...

  9. net2.0对于递归变量的处理方式不同引发的递归问题

    同样的代码,用NET2.0执行产生的效果与其它框架使用的不同,导致报错. 认真查找原因后发现该程序的编写人员隐式的使用了一个公共变量,使之在递归过程中不断的被改写,使得1次递归后就破坏了原来的循环体, ...

  10. 5.0、Android Studio调试你的应用

    Android Studio包含了一个调试器,允许你调试运行在Android虚拟机或连接的Android设备的应用.通过Android Studio的调试器,你可以: 1. 选择你调试设备的app 2 ...

随机推荐

  1. Spark3学习【基于Java】1. Spark-Sql入门程序

    spark-sql是用来处理结构化数据的模块,是入门spark的首要模块. 技术的学习无非就是去了解它的API,但是Spark有点难,因为它的例子和网上能搜到的基本都是Scala写的.我们这里使用Ja ...

  2. Java 面向对象编程之接口

    什么是接口? 是抽象方法的集合,接口通常以interface来声明,一个类通过继承接口的方式,从而来继承接口的抽象方法 语法 interface 名称 [extends 其他的接⼝名] { // 声明 ...

  3. [oeasy]python0122_日韩字符_日文假名_JIS_Shift_韩国谚文

    日文假名和韩国谚文 回忆上次内容 上次回顾了非ascii的拉丁字符编码的进化过程 0-127 是 ascii 的领域   世界各地编码分布 拉丁字符扩展 ascii 共 16 种 由iso组织制定 从 ...

  4. Java 根据XPATH批量替换XML节点中的值

    根据XPATH批量替换XML节点中的值 by: 授客 QQ:1033553122 测试环境 JDK 1.8.0_25 代码实操 message.xml文件 <Request service=&q ...

  5. typora下载安装以及notepad++下载安装

    notepad++下载安装 找到浏览器输入:notepad或者 https://notepad-plus-plus.org/downloads/ 官网下载即可使用 如果官网崩了,可以在微信公众号:A软 ...

  6. 断点续传:使用java对大文件进行分块与合并

    通常我们下载上传的视频文件比较大.虽然https协议没有规定上传文件大小的限制,但是网络的质量,电脑硬件的参差不齐可能会导致大文件快要上传完成的时候突然断网了要重新上传,非常影响用户体验.以此我们引入 ...

  7. C语言中的断言函数assert

    简介 assert 是 C 语言中的一个宏,用于在程序运行时进行条件检查,主要用于调试目的.它在 <assert.h> 头文件中定义,用于验证程序中的假设条件是否成立,如果不成立,程序将打 ...

  8. 【Vue】HutoolExcel导出

    最近写Excel导出功能,发现需求有点复杂,这里整理一下思路和解决方案 一.需求背景: 老系统改造,功能和代码是现成的,预览了一下内容: 第一个是有特定样式,比如首行标题,以及红色的列名称 第二个,导 ...

  9. 什么样的AI计算框架才是受用户喜欢的?

    说明,本文是个人的一些胡想. 背景: AI计算框架现在从国外的百家争鸣过度到了国内百家争鸣的局面了.在7.8年前的时候,国外的AI计算框架简直是数不胜数,从14.15年前Nvidia公司的显卡需要手动 ...

  10. 中国超级计算机为什么不能为AI提供算力?

    网上看到这样的帖子: https://www.zhihu.com/question/609008408/answer/3130831897 ============================== ...