肉夾饃(https://github.com/inversionhourglass/Rougamo),一款編譯時(shí)AOP組件,無(wú)需在應(yīng)用啟動(dòng)時(shí)進(jìn)行初始化,也無(wú)需繁瑣的配置;支持所有種類(lèi)方法(同步和異步、靜態(tài)和實(shí)例、構(gòu)造方法/屬性/普通方法);提供了簡(jiǎn)單易上手的Attribute應(yīng)用方式,同時(shí)還提供了類(lèi)
肉夾饃(Rougamo)是一款編譯時(shí)AOP組件,無(wú)需在應(yīng)用啟動(dòng)時(shí)進(jìn)行初始化,也無(wú)需繁瑣的配置。它支持所有種類(lèi)方法(同步和異步、靜態(tài)和實(shí)例、構(gòu)造方法/屬性/普通方法),提供了簡(jiǎn)單易上手的Attribute應(yīng)用方式,同時(shí)還提供了類(lèi)AspectJ表達(dá)式的批量應(yīng)用規(guī)則。
在4.0版本發(fā)布的文章評(píng)論中,有朋友反饋了一個(gè)調(diào)試時(shí)無(wú)法查看方法內(nèi)部變量值的問(wèn)題。本次更新就是修復(fù)這個(gè)問(wèn)題的,4.0.1不包含其他修改,對(duì)調(diào)試時(shí)禁用肉夾饃的朋友沒(méi)有任何影響,可以酌情升級(jí)。
4.0.1本來(lái)是不準(zhǔn)備發(fā)博客的,內(nèi)容一句話就結(jié)束了,不過(guò)又想到前段時(shí)間還發(fā)布了IoC擴(kuò)展,索性就合在一起寫(xiě)一篇博客吧。
各位在使用肉夾饃時(shí),最常遇到的問(wèn)題可能就是如何與IoC交互了,F(xiàn)在主流的動(dòng)態(tài)代理本身就需要IoC才能完成,所以動(dòng)態(tài)代理在IoC交互方面具有天然的優(yōu)勢(shì),而肉夾饃編譯時(shí)完成不依賴(lài)IoC,所以與IoC的交互也不是很方便。但不方便并不是不能。此前已經(jīng)有朋友在自己的項(xiàng)目中實(shí)現(xiàn)了IoC的訪問(wèn),比如Rougamo.OpenTelemetry, FreeSql?紤]到IoC的使用在現(xiàn)在已經(jīng)非常普遍,所以新增了幾個(gè)常用IoC的擴(kuò)展包。
目前只對(duì)最常用的兩個(gè)IoC組件提供了支持,一個(gè)是微軟官方的
Microsoft.Extensions.DependencyInjection
,另一個(gè)是
Autofac
,主要包含四個(gè)NuGet:
Rougamo.Extensions.DependencyInjection.AspNetCore
Rougamo.Extensions.DependencyInjection.GenericHost
Rougamo.Extensions.DependencyInjection.Autofac.AspNetCore
Rougamo.Extensions.DependencyInjection.Autofac
其中
AspNetCore
結(jié)尾的兩個(gè)NuGet專(zhuān)用于AspNetCore(廢話了哦),另外兩個(gè)NuGet用于通用主機(jī)(Generic Host)和Framework等場(chǎng)景。
在引用這些NuGet包時(shí),你會(huì)發(fā)現(xiàn)他們都包含很多個(gè)版本,這并不是版本迭代更新快或者版本號(hào)設(shè)置錯(cuò)了導(dǎo)致的,版本號(hào)有相應(yīng)的規(guī)則,它們的主版本號(hào)跟隨對(duì)應(yīng)IoC組件的NuGet主版本號(hào)。微軟官方的兩個(gè)擴(kuò)展包的主版本號(hào)跟隨
Microsoft.Extensions.*
的主版本號(hào)(也是.NET SDK的版本),
Autofac
的兩個(gè)擴(kuò)展包的主版本號(hào)跟隨
Autofac
的主版本號(hào)。
下面直接用代碼快速展示如何使用對(duì)應(yīng)的擴(kuò)展包。
// 注冊(cè)Rougamo(注:如果你不使用IoC/DI功能,Rougamo默認(rèn)是不需要注冊(cè)操作的)
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// ...省略其他步驟
builder.Services.AddRougamoAspNetCore();
// ...省略其他步驟
}
// 在切面類(lèi)型中獲取IServiceProvider實(shí)例并使用
public class TestAttribute : MoAttribute
{
public override void OnEntry(MethodContext context)
{
// 使用擴(kuò)展方法GetServiceProvider獲取IServiceProvider實(shí)例
var services = context.GetServiceProvider();
// 使用IServiceProvider
var xxx = services.GetService();
}
}
// 注冊(cè)Rougamo(注:如果你不使用IoC/DI功能,Rougamo默認(rèn)是不需要注冊(cè)操作的)
public static void Main(string[] args)
{
var builder = Host.CreateDefaultBuilder();
// ...省略其他步驟
builder.ConfigureServices(services => services.AddRougamoGenericHost());
// ...省略其他步驟
}
// 在切面類(lèi)型中獲取IServiceProvider實(shí)例并使用
public class TestAttribute : MoAttribute
{
public override void OnEntry(MethodContext context)
{
// 使用擴(kuò)展方法GetServiceProvider獲取IServiceProvider實(shí)例
var services = context.GetServiceProvider();
// 使用IServiceProvider
var xxx = services.GetService();
}
}
// 注冊(cè)Rougamo(注:如果你不使用IoC/DI功能,Rougamo默認(rèn)是不需要注冊(cè)操作的)
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Host
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer(builder =>
{
builder.RegisterRougamoAspNetCore();
});
// 注冊(cè)IHttpContextAccessor也是必須的
builder.Services.AddHttpContextAccessor();
}
// 在切面類(lèi)型中獲取ILifetimeScope實(shí)例并使用
public class TestAttribute : MoAttribute
{
public override void OnEntry(MethodContext context)
{
// 使用擴(kuò)展方法GetAutofacCurrentScope獲取ILifetimeScope實(shí)例
var scope = context.GetAutofacCurrentScope();
// 使用ILifetimeScope
var xxx = scope.Resolve();
}
}
// 注冊(cè)Rougamo(注:如果你不使用IoC/DI功能,Rougamo默認(rèn)是不需要注冊(cè)操作的)
public static void Main(string[] args)
{
var builder = Host.CreateDefaultBuilder();
builder
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer(builder =>
{
builder.RegisterRougamo();
});
}
// 在切面類(lèi)型中獲取IServiceProvider實(shí)例并使用
public class TestAttribute : MoAttribute
{
public override void OnEntry(MethodContext context)
{
// 使用擴(kuò)展方法GetAutofacCurrentScope獲取ILifetimeScope實(shí)例
var scope = context.GetAutofacCurrentScope();
// 使用ILifetimeScope
var xxx = scope.Resolve();
}
}
比較早的Framework項(xiàng)目以及WinForm、WPF等項(xiàng)目可能并沒(méi)有使用通用主機(jī)(Generic Host),此時(shí)使用
Rougamo.Extensions.DependencyInjection.Autofac
將更加直接,初始化時(shí)創(chuàng)建
ContainerBuilder
后直接調(diào)用
RegisterRougamo
擴(kuò)展方法即可。
var builder = new ContainerBuilder();
builder.RegisterRougamo();
肉夾饃IoC/DI擴(kuò)展更多的信息請(qǐng)?jiān)L問(wèn) Rougamo.DI (https://github.com/inversionhourglass/Rougamo.DI),歡迎反饋建議和提交PR.
小編推薦閱讀機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對(duì)象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀升訊威在線客服與營(yíng)銷(xiāo)系統(tǒng)介紹
閱讀基于鴻蒙NEXT的血型遺傳計(jì)算器開(kāi)發(fā)案例
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶(hù)端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動(dòng)態(tài)代理的對(duì)比分析
閱讀Win11筆記本“自動(dòng)管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)