麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > .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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久久久免费精品国产小说色大师 | 成人短视频在线播放 | 成人三区四区 | 91精品国产毛片 | 色综合久久久久久久久久久 | 国产91精品亚洲精品日韩已满 | 欧美成人免费tv在线播放 | 91九色福利| 九色中文| 国产精品v片在线观看不卡 成人一区二区三区在线 | 精品一区二区三区网站 | 久久久成人免费视频 | 国产91九色 | 亚洲欧美在线看 | 成人nv在线观看 | 666sao| 黄色特级一级片 | 7m视频成人精品分类 | 美女视频免费一区二区 | 羞羞视频免费观看网站 | 国产精品剧情一区二区三区 | 蜜桃视频在线观看免费 | 91网页视频入口在线观看 | 欧美日韩一区,二区,三区,久久精品 | 亚洲精品久久久久久久久久 | xxxxxx打针视频vk | tube69xxxxxhd | h色视频网站 | 久久吊 | 欧美3p激情一区二区三区猛视频 | av成人在线电影 | 国产一级性生活视频 | 成人午夜免费福利 | 毛片福利 | 99热久草| 超碰在线97国产 | 免费一级特黄欧美大片勹久久网 | 国产精品久久久久久久久久 | 深夜免费视频 | 姑娘第四集免费看视频 | 亚洲一区二区在线 |