国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

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

來源:懂視網 責編:小采 時間:2020-11-27 22:35:41
文檔

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

Asp.Net Core輕量級Aop解決方案:AspectCore:什么是AspectCore Project ? AspectCore Project 是適用于Asp.Net Core 平臺的輕量級 Aop(Aspect-oriented programming) 解決方案,它更好的遵循Asp.Net Core的模塊化開發理念,使用AspectCore可以更容易構建低耦合、易擴展的Web應用
推薦度:
導讀Asp.Net Core輕量級Aop解決方案:AspectCore:什么是AspectCore Project ? AspectCore Project 是適用于Asp.Net Core 平臺的輕量級 Aop(Aspect-oriented programming) 解決方案,它更好的遵循Asp.Net Core的模塊化開發理念,使用AspectCore可以更容易構建低耦合、易擴展的Web應用

什么是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.DependencyInjection
    PM> 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,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

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

    Asp.Net Core輕量級Aop解決方案:AspectCore:什么是AspectCore Project ? AspectCore Project 是適用于Asp.Net Core 平臺的輕量級 Aop(Aspect-oriented programming) 解決方案,它更好的遵循Asp.Net Core的模塊化開發理念,使用AspectCore可以更容易構建低耦合、易擴展的Web應用
    推薦度:
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 青青草国产在线视频 | 日韩一页 | 日本免费一二三区 | 亚洲 欧美 日韩在线 | 欧美极品第1页专区 | 国产亚洲视频在线观看 | 91福利国产在线观一区二区 | 亚洲 欧美 自拍 另类 | 国产精品亚洲一区二区三区久久 | 国内一级一级毛片a免费 | 色综合久久中文字幕综合网 | 亚洲一区二区三区高清 | 日韩三级一区二区 | 视频一区二区三区欧美日韩 | 国产视频最新 | 欧美 日韩 国产 在线 | 国产精品久久久久9999 | 亚洲v欧美v日韩v国产v | 欧美亚洲综合一区 | 国产精品毛片久久久久久久 | 国产精品特级毛片一区二区三区 | 国产成人精品日本亚洲语音1 | 97成人资源| 亚洲国产精品婷婷久久久久 | 韩国精品一区 | 美女一级毛片 | 高清国产美女一级a毛片 | 精品亚洲一区二区 | 亚洲视频一区二区 | 久久精品成人 | 最近中文字幕电影在线看 | 一级毛片真人不卡免费播 | 亚洲免费网站观看视频 | 欧美日韩精品 | 一区二区国产精品 | 国产精品网站在线进入 | 日韩欧美一区二区在线 | 久久大陆 | 欧美综合图区 | 国产成人久久精品二区三区牛 | 一级成人a免费视频 |