From 30ee9106fb6f572468e1571f7216737909f9f23c Mon Sep 17 00:00:00 2001 From: Neil Date: Fri, 3 Apr 2020 22:11:19 +0800 Subject: [PATCH] =?UTF-8?q?Update=201.=E4=BD=BF=E7=94=A8=E6=8C=87=E5=8D=97?= =?UTF-8?q?.md=20(#213)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update docs/1.使用指南.md 1. 主要依據原文件描述調整為 2.0.0 版本 AspectCore 實作 Aop 機制實際使用情形 * Update 1.使用指南.md 調整排版 --- ...77\347\224\250\346\214\207\345\215\227.md" | 65 ++++++++++--------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git "a/docs/1.\344\275\277\347\224\250\346\214\207\345\215\227.md" "b/docs/1.\344\275\277\347\224\250\346\214\207\345\215\227.md" index cb90e016..d81deebe 100644 --- "a/docs/1.\344\275\277\347\224\250\346\214\207\345\215\227.md" +++ "b/docs/1.\344\275\277\347\224\250\346\214\207\345\215\227.md" @@ -1,8 +1,9 @@ # 1. 使用指南 -(简单的代码示例:https://github.com/fs7744/AspectCoreDemo ) +2.0.0 版本 :arrow_up: (简单的代码示例:https://github.com/cdcd72/NetCore.AspectCore.AOP.Demo) +2.0.0 版本 :arrow_down: (简单的代码示例:https://github.com/fs7744/AspectCoreDemo) -* 开始使用AspectCore +## 开始使用AspectCore * 启动 Visual Studio。从 File 菜单, 选择 New > Project。选择 ASP.NET Core Web Application 项目模版,创建新的 ASP.NET Core Web Application 项目。 @@ -68,19 +69,29 @@ ``` * 注册`ICustomService`,接着,在`ConfigureServices`中配置创建代理类型的容器: ``` csharp - public IServiceProvider ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { services.AddTransient(); services.AddMvc(); - services.AddDynamicProxy(); - return services.BuildAspectCoreServiceProvider(); + services.ConfigureDynamicProxy(); } ``` -* 拦截器配置。 - - 全局拦截器。使用`AddDynamicProxy(Action)`的重载方法,其中`IAspectConfiguration`提供`Interceptors`注册全局拦截器: +* 最后于 `Program` 的 `CreateHostBuilder` 處加上 `UseServiceProviderFactory(new DynamicProxyServiceProviderFactory())`: + ``` csharp + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }) + // 略 + .UseServiceProviderFactory(new DynamicProxyServiceProviderFactory()); + ``` +--- +## 拦截器配置 +* 全局拦截器。使用`ConfigureDynamicProxy(Action)`的重载方法,其中`IAspectConfiguration`提供`Interceptors`注册全局拦截器: ``` csharp - services.AddDynamicProxy(config => + services.ConfigureDynamicProxy(config => { config.Interceptors.AddTyped(); }); @@ -115,32 +126,33 @@ ``` 修改全局拦截器注册: ``` csharp - services.AddDynamicProxy(config => + services.ConfigureDynamicProxy(config => { config.Interceptors.AddTyped(args: new object[] { "custom" }); }); ``` 作为服务的全局拦截器。在`ConfigureServices`中添加: ``` csharp - services.AddTransient(provider => new CustomInterceptorAttribute("service")); + services.AddTransient(provider => new CustomInterceptorAttribute("custom")); ``` 修改全局拦截器注册: ``` csharp - services.AddDynamicProxy(config => + services.ConfigureDynamicProxy(config => { + // 加入已注册服务 config.Interceptors.AddServiced(); }); ``` 作用于特定`Service`或`Method`的全局拦截器,下面的代码演示了作用于带有`Service`后缀的类的全局拦截器: ``` csharp - services.AddDynamicProxy(config => + services.ConfigureDynamicProxy(config => { - config.Interceptors.AddTyped(method => method.DeclaringType.Name.EndsWith("Service")); + config.Interceptors.AddTyped(method => method.Name.EndsWith("MethodName")); }); ``` 使用通配符的特定全局拦截器: ``` csharp - services.AddDynamicProxy(config => + services.ConfigureDynamicProxy(config => { config.Interceptors.AddTyped(Predicates.ForService("*Service")); }); @@ -155,7 +167,7 @@ ``` 同时支持全局忽略配置,亦支持通配符: ``` csharp - services.AddDynamicProxy(config => + services.ConfigureDynamicProxy(config => { //App1命名空间下的Service不会被代理 config.NonAspectPredicates.AddNamespace("App1"); @@ -178,13 +190,13 @@ ``` * 拦截器中的依赖注入。在拦截器中支持属性注入,构造器注入和服务定位器模式。 - 属性注入,在拦截器中拥有`public get and set`权限的属性标记`[AspectCore.Injector.FromContainerAttribute]`特性,即可自动注入该属性,如: + 属性注入,在拦截器中拥有`public get and set`权限的属性标记`[AspectCore.DependencyInjection.FromServiceContextAttribute]`特性,即可自动注入该属性,如: ``` csharp public class CustomInterceptorAttribute : AbstractInterceptorAttribute { - //ps : 只有使用 config.Interceptors.AddTyped(); 时,属性注入才生效, - // 不能使用以下这种方式 services.AddSingleton(); + [ServiceInterceptor(typeof(CustomInterceptor))] - [FromContainer] + //ps : 只有使用 config.Interceptors.AddTyped(); 时,属性注入才生效, + // 不能使用以下这种方式 services.AddSingleton(); + services.ConfigureDynamicProxy(config => { config.Interceptors.AddServiced(); }); + [FromServiceContext] public ILogger Logger { get; set; } @@ -202,19 +214,13 @@ { private readonly ILogger ctorlogger; - // ps : 当全局配置 config.Interceptors.AddTyped(); 时,构造器注入无法自动注入,需要手动处理 - // 只有使用 services.AddSingleton(); + [ServiceInterceptor(typeof(CustomInterceptor))] 才会自动注入 + // ps : 当全局配置 config.Interceptors.AddTyped(); 时,构造器注入无法自动注入,需要手动处理 + // 只有使用 services.AddSingleton(); + services.ConfigureDynamicProxy(config => { config.Interceptors.AddServiced(); }); 才会自动注入 public CustomInterceptor(ILogger ctorlogger) { this.ctorlogger = ctorlogger; } } - - public interface ICustomService - { - [ServiceInterceptor(typeof(CustomInterceptorAttribute))] - void Call(); - } ``` 服务定位器模式。拦截器上下文`AspectContext`可以获取当前Scoped的`ServiceProvider`: @@ -230,4 +236,5 @@ } ``` -ps : 原文(http://www.cnblogs.com/liuhaoyang/p/aspectcore-introduction-1.html) +2.0.0 版本 :arrow_up: ps : 原文(https://www.thinkinmd.com/post/2020/03/20/use-aspectcore-to-implement-aop-mechanism/) +2.0.0 版本 :arrow_down: ps : 原文(http://www.cnblogs.com/liuhaoyang/p/aspectcore-introduction-1.html)