亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

Asp.Net Core輕量級Aop解決方案:AspectCore

2024-07-10 13:32:24
字體:
來源:轉載
供稿:網友

什么是AspectCore Project ?

AspectCore Project 是適用于Asp.Net Core 平臺的輕量級 Aop(Aspect-oriented programming) 解決方案,它更好的遵循Asp.Net Core的模塊化開發理念,使用AspectCore可以更容易構建低耦合、易擴展的Web應用程序。AspectCore使用Emit實現高效的動態代理從而不依賴任何第三方Aop庫。

開使使用AspectCore

啟動 Visual Studio。從 File 菜單, 選擇 New > Project。選擇 ASP.NET Core Web Application 項目模版,創建新的 ASP.NET Core Web Application 項目。

  • 從 Nuget 安裝 AspectCore.Extensions.DependencyInjection package:
  • PM>   Install-Package AspectCore.Extensions.DependencyInjection
  • 在一般情況下可以使用抽象的InterceptorAttribute自定義特性類,它實現IInterceptor接口。AspectCore默認實現了基于Attribute的攔截器配置。我們的自定義攔截器看起來像下面這樣:
public class CustomInterceptorAttribute : InterceptorAttribute{  public async override Task Invoke(IAspectContext context, AspectDelegate next)  {    try    {      Console.WriteLine("Before service call");      await next(context);    }    catch (Exception)    {      Console.WriteLine("Service threw an exception!");      throw;    }    finally    {      Console.WriteLine("After service call");    }   } }

定義ICustomService接口和它的實現類CustomService:

public interface ICustomService{  [CustomInterceptor]  void Call();}public class CustomService : ICustomService{  public void Call()  {    Console.WriteLine("service calling...");  }}

在HomeController中注入ICustomService:

public class HomeController : Controller{  private readonly ICustomService _service;  public HomeController(ICustomService service)  {    _service = service;  }  public IActionResult Index()  {    _service.Call();    return View();  }}

注冊ICustomService,接著,在ConfigureServices中配置創建代理類型的容器:

public IServiceProvider ConfigureServices(IServiceCollection services){  services.AddTransient<ICustomService, CustomService>();  services.AddMvc();  services.AddAspectCore();  return services.BuildAspectCoreServiceProvider();}

攔截器配置。首先安裝AspectCore.Extensions.Configuration package:

PM> Install-Package AspectCore.Extensions.Configuration

全局攔截器。使用AddAspectCore(Action<AspectCoreOptions>)的重載方法,其中AspectCoreOptions提供InterceptorFactories注冊全局攔截器:

 services.AddAspectCore(config => {   config.InterceptorFactories.AddTyped<CustomInterceptorAttribute>(); });

帶構造器參數的全局攔截器,在CustomInterceptorAttribute中添加帶參數的構造器:

public class CustomInterceptorAttribute : InterceptorAttribute{  private readonly string _name;  public CustomInterceptorAttribute(string name)  {    _name = name;  }  public async override Task Invoke(AspectContext context, AspectDelegate next)  {    try    {      Console.WriteLine("Before service call");      await next(context);    }    catch (Exception)    {      Console.WriteLine("Service threw an exception!");      throw;    }    finally    {      Console.WriteLine("After service call");    }  }}

修改全局攔截器注冊:

services.AddAspectCore(config =>{   config.InterceptorFactories.AddTyped<CustomInterceptorAttribute>(args: new object[] { "custom" });});

作為服務的全局攔截器。在ConfigureServices中添加:

services.AddTransient<CustomInterceptorAttribute>(provider => new CustomInterceptorAttribute("service"));

修改全局攔截器注冊:

services.AddAspectCore(config =>{  config.InterceptorFactories.AddServiced<CustomInterceptorAttribute>();});

作用于特定Service或Method的全局攔截器,下面的代碼演示了作用于帶有Service后綴的類的全局攔截器:

services.AddAspectCore(config =>{  config.InterceptorFactories.AddTyped<CustomInterceptorAttribute>(method => method.DeclaringType.Name.EndsWith("Service"));});

使用通配符的特定全局攔截器:

services.AddAspectCore(config =>{  config.InterceptorFactories.AddTyped<CustomInterceptorAttribute>(PredicateFactory.ForService("*Service"));});

在AspectCore中提供NonAspectAttribute來使得Service或Method不被代理:

[NonAspect]public interface ICustomService{  void Call();}

同時支持全局忽略配置,亦支持通配符:

 services.AddAspectCore(config => {   //App1命名空間下的Service不會被代理   config.NonAspectOptions.AddNamespace("App1");   //最后一級為App1的命名空間下的Service不會被代理   config.NonAspectOptions.AddNamespace("*.App1");   //ICustomService接口不會被代理   config.NonAspectOptions.AddService("ICustomService");   //后綴為Service的接口和類不會被代理   config.NonAspectOptions.AddService("*Service");   //命名為Query的方法不會被代理   config.NonAspectOptions.AddMethod("Query");   //后綴為Query的方法不會被代理   config.NonAspectOptions.AddMethod("*Query"); });

攔截器中的依賴注入。在攔截器中支持屬性注入,構造器注入和服務定位器模式。
屬性注入,在攔截器中擁有public get and set權限的屬性標記[AspectCore.Abstractions.FromServices](區別于Microsoft.AspNetCore.Mvc.FromServices)特性,即可自動注入該屬性,如:

public class CustomInterceptorAttribute : InterceptorAttribute{  [AspectCore.Abstractions.FromServices]  public ILogger<CustomInterceptorAttribute> Logger { get; set; }  public override Task Invoke(AspectContext context, AspectDelegate next)  {    Logger.LogInformation("call interceptor");    return next(context);  }}

構造器注入需要使攔截器作為Service,除全局攔截器外,仍可使用ServiceInterceptor使攔截器從DI中激活:

public interface ICustomService{  [ServiceInterceptor(typeof(CustomInterceptorAttribute))]  void Call();}

服務定位器模式。攔截器上下文AspectContext可以獲取當前Scoped的ServiceProvider:

public class CustomInterceptorAttribute : InterceptorAttribute{  public override Task Invoke(AspectContext context, AspectDelegate next)  {    var logger = context.ServiceProvider.GetService<ILogger<CustomInterceptorAttribute>>();    logger.LogInformation("call interceptor");    return next(context);  }}

使用Autofac和AspectCore。AspectCore原生支持集成Autofac,我們需要安裝下面兩個nuget packages:

PM> Install-Package Autofac.Extensions.DependencyInjectionPM> Install-Package AspectCore.Extensions.Autofac

AspectCore提供RegisterAspectCore擴展方法在Autofac的Container中注冊動態代理需要的服務,并提供AsInterfacesProxy和AsClassProxy擴展方法啟用interface和class的代理。修改ConfigureServices方法為:

public IServiceProvider ConfigureServices(IServiceCollection services){  services.AddMvc();  var container = new ContainerBuilder();  container.RegisterAspectCore();  container.Populate(services);  container.RegisterType<CustomService>().As<ICustomService>().InstancePerDependency().AsInterfacesProxy();  return new AutofacServiceProvider(container.Build());}

有問題反饋

如果您有任何問題,請提交 Issue 給我們。

AspectCore Project 項目地址: https://github.com/aspectcore

以上所述是小編給大家介紹的Asp.Net Core輕量級Aop解決方案:AspectCore,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲最大的网站| 一区二区福利视频| 97精品在线视频| 亚洲人成网站999久久久综合| 久久久噜噜噜久久久| 国产精品欧美亚洲777777| 国产精品久久久久久久久久尿| 91免费的视频在线播放| 久久久久久久久电影| 色诱女教师一区二区三区| 日本老师69xxx| 中文字幕成人在线| 国产在线观看精品| 亚洲福利影片在线| 国产极品jizzhd欧美| 久久久精品国产网站| 国产精品999999| 亚洲自拍av在线| 国产在线拍揄自揄视频不卡99| 大伊人狠狠躁夜夜躁av一区| 日韩av观看网址| 亚洲天堂av综合网| 日韩欧美亚洲国产一区| 91中文精品字幕在线视频| 国模私拍一区二区三区| 国产女人18毛片水18精品| 日韩精品在线观看网站| xxxx性欧美| 欧美国产日韩在线| 久久天天躁狠狠躁老女人| 一区三区二区视频| 亚洲午夜av电影| 日本欧美黄网站| 国产va免费精品高清在线| 不用播放器成人网| 91国产美女在线观看| 51久久精品夜色国产麻豆| 中文字幕欧美日韩| 26uuu日韩精品一区二区| 国产一区二区激情| 国内精品久久久久久| 欧美电影在线观看高清| 亚洲第一页中文字幕| 性欧美xxxx视频在线观看| 亚洲美女av网站| 亚洲天堂开心观看| 日韩一区二区欧美| 亚洲精品天天看| 国产日韩欧美在线观看| www国产亚洲精品久久网站| 国产精品流白浆视频| 日韩欧美一区二区三区久久| 欧美一区二区三区……| 成人免费福利在线| 国产午夜精品全部视频在线播放| 亚洲精品国产精品久久清纯直播| 欧美在线www| 国产91|九色| 久久不射电影网| 77777少妇光屁股久久一区| 国产精品久久久久av| 国内精品久久影院| 久久久亚洲影院| 亚洲免费一级电影| 国产精品久久久久久久久久久久| 日韩美女中文字幕| 久久精品欧美视频| 亚洲视频电影图片偷拍一区| 亚洲一区美女视频在线观看免费| 91国产视频在线播放| 久久久亚洲精品视频| 欧美成人午夜剧场免费观看| 欧美中文字幕精品| 亚洲一级一级97网| 久久九九亚洲综合| 亚洲欧美日韩中文视频| 亚洲欧美国产视频| 欧美日韩亚洲视频| 成人黄色在线观看| 亚洲精品影视在线观看| 国产这里只有精品| 精品日韩中文字幕| 国产精品网红直播| 91网站在线免费观看| 中文字幕精品在线视频| 热99久久精品| 久久精彩免费视频| 日韩电影视频免费| 日韩在线视频观看正片免费网站| 一本色道久久综合狠狠躁篇怎么玩| 在线播放日韩专区| 国产男人精品视频| 91精品久久久久久久久久入口| 亚洲男人天堂2019| 精品自在线视频| 亚洲自拍偷拍区| 亚洲天堂色网站| 亚洲精品免费一区二区三区| 日韩中文字幕久久| 亚洲一区制服诱惑| 亚洲欧美另类中文字幕| 91精品国产自产在线| 色综合久久中文字幕综合网小说| 国产欧美va欧美va香蕉在| 亚洲天堂av在线免费观看| 久久免费精品日本久久中文字幕| 97精品伊人久久久大香线蕉| 国产精品成人aaaaa网站| 久久99久久久久久久噜噜| 色偷偷噜噜噜亚洲男人| 亚洲毛茸茸少妇高潮呻吟| 91在线网站视频| 久久男人资源视频| 国产精品久久久久久久久久久久久久| 国产99视频在线观看| 欧美成年人网站| 国产精品久久久久av免费| 日韩电影中文字幕在线| 中文字幕在线看视频国产欧美| 亚洲性生活视频| 国产综合香蕉五月婷在线| 中文字幕亚洲综合久久筱田步美| 中文字幕亚洲国产| 亚洲精品91美女久久久久久久| 欧美日韩激情美女| 日韩精品在线观| 最近2019中文免费高清视频观看www99| 日韩电影免费在线观看| 97在线视频免费| 亚洲成人久久一区| 国产一级揄自揄精品视频| 国产精品video| 国产成人精品久久二区二区| 成人黄色大片在线免费观看| 中文字幕亚洲精品| 97香蕉久久超级碰碰高清版| 91精品国产综合久久香蕉| 欧美亚洲在线视频| 欧美性猛交xxxx偷拍洗澡| 在线播放国产一区二区三区| 97在线视频精品| 亚洲欧美日韩国产中文专区| 清纯唯美亚洲激情| 岛国av午夜精品| 亚洲精品国产精品自产a区红杏吧| 久久综合88中文色鬼| 久久香蕉国产线看观看av| 欧美激情一区二区三级高清视频| 亚洲在线免费看| 亚洲综合小说区| 美女啪啪无遮挡免费久久网站| 日韩中文在线观看| 国产精品久久久久久久久久久不卡| 欧美在线视频观看免费网站| 国产精品久久中文| 97在线视频精品| 亚洲一品av免费观看| 国内揄拍国内精品| 岛国av一区二区| 欧美尤物巨大精品爽| 国产美女搞久久| 久久综合色影院| 亚洲色在线视频| 亚洲国产欧美精品|