国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

Asp.Net Core輕量級(jí)Aop解決方案:AspectCore

2024-07-10 13:32:24
字體:
供稿:網(wǎng)友

什么是AspectCore Project ?

AspectCore Project 是適用于Asp.Net Core 平臺(tái)的輕量級(jí) Aop(Aspect-oriented programming) 解決方案,它更好的遵循Asp.Net Core的模塊化開發(fā)理念,使用AspectCore可以更容易構(gòu)建低耦合、易擴(kuò)展的Web應(yīng)用程序。AspectCore使用Emit實(shí)現(xiàn)高效的動(dòng)態(tài)代理從而不依賴任何第三方Aop庫(kù)。

開使使用AspectCore

啟動(dòng) Visual Studio。從 File 菜單, 選擇 New > Project。選擇 ASP.NET Core Web Application 項(xiàng)目模版,創(chuàng)建新的 ASP.NET Core Web Application 項(xiàng)目。

  • 從 Nuget 安裝 AspectCore.Extensions.DependencyInjection package:
  • PM>   Install-Package AspectCore.Extensions.DependencyInjection
  • 在一般情況下可以使用抽象的InterceptorAttribute自定義特性類,它實(shí)現(xiàn)IInterceptor接口。AspectCore默認(rèn)實(shí)現(xiàn)了基于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接口和它的實(shí)現(xiàn)類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();  }}

注冊(cè)ICustomService,接著,在ConfigureServices中配置創(chuàng)建代理類型的容器:

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

全局?jǐn)r截器。使用AddAspectCore(Action<AspectCoreOptions>)的重載方法,其中AspectCoreOptions提供InterceptorFactories注冊(cè)全局?jǐn)r截器:

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

帶構(gòu)造器參數(shù)的全局?jǐn)r截器,在CustomInterceptorAttribute中添加帶參數(shù)的構(gòu)造器:

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");    }  }}

修改全局?jǐn)r截器注冊(cè):

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

作為服務(wù)的全局?jǐn)r截器。在ConfigureServices中添加:

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

修改全局?jǐn)r截器注冊(cè):

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

作用于特定Service或Method的全局?jǐn)r截器,下面的代碼演示了作用于帶有Service后綴的類的全局?jǐn)r截器:

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

使用通配符的特定全局?jǐn)r截器:

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

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

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

同時(shí)支持全局忽略配置,亦支持通配符:

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

攔截器中的依賴注入。在攔截器中支持屬性注入,構(gòu)造器注入和服務(wù)定位器模式。
屬性注入,在攔截器中擁有public get and set權(quán)限的屬性標(biāo)記[AspectCore.Abstractions.FromServices](區(qū)別于Microsoft.AspNetCore.Mvc.FromServices)特性,即可自動(dòng)注入該屬性,如:

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);  }}

構(gòu)造器注入需要使攔截器作為Service,除全局?jǐn)r截器外,仍可使用ServiceInterceptor使攔截器從DI中激活:

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

服務(wù)定位器模式。攔截器上下文AspectContext可以獲取當(dāng)前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,我們需要安裝下面兩個(gè)nuget packages:

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

AspectCore提供RegisterAspectCore擴(kuò)展方法在Autofac的Container中注冊(cè)動(dòng)態(tài)代理需要的服務(wù),并提供AsInterfacesProxy和AsClassProxy擴(kuò)展方法啟用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());}

有問題反饋

如果您有任何問題,請(qǐng)?zhí)峤?Issue 給我們。

AspectCore Project 項(xiàng)目地址: https://github.com/aspectcore

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到ASP.NET教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 石泉县| 盐边县| 嘉兴市| 南雄市| 巴青县| 达日县| 玛曲县| 平舆县| 广饶县| 基隆市| 津南区| 惠来县| 酒泉市| 白朗县| 桑日县| 宣威市| 广水市| 辉县市| 昌乐县| 曲靖市| 博兴县| 巴彦淖尔市| 遂平县| 莲花县| 定远县| 沂南县| 上犹县| 古交市| 巴南区| 泽普县| 西吉县| 榆中县| 磴口县| 娱乐| 靖宇县| 塘沽区| 双鸭山市| 石家庄市| 谷城县| 金华市| 德昌县|