繁体   English   中英

拦截器与 Microsoft.Extensions.DependencyInjection 和 asp.net web api 2 用于横切关注点,如日志记录

[英]Interceptor with Microsoft.Extensions.DependencyInjection and asp.net web api 2 for cross cutting concerns like logging

我们在 asp.net web api2 中使用 Microsoft.Extensions.DependencyInjection 进行依赖注入。

对于像日志这样的横切关注点,我们认为应该考虑面向方面的编程,并且无法在上述di中找到任何支持。

其他 DI,如 Castle、Unity 和 ninject,在查看其基准后选择退出。 有什么方法可以使用其他 di 框架的注入器,例如城堡动态代理并将其与 Microsoft.Extensions.DependencyInjection 一起使用?

也欢迎任何与 IL 编织框架相关的建议。 考虑 PostSharp 被排除,因为它不是免费的。

Decor.NETCastle.Core动态代理的包装器,旨在简化方法装饰。

它与 DI 容器无关,但与 Microsoft 的 DI 集成,后者在Decor.Extensions.Microsoft.DependencyInjection NuGet 包中可用。

  1. 你创建一个装饰器:

     public class YourDecorator : IDecorator { public SomeDependency SomeDependency { get; } public YourDecorator(SomeDependency someDependency) // Supports DI. { SomeDependency = someDependency; } public async Task OnInvoke(Call call) { ... await call.Next(); ... } }
  2. 装饰你的方法:

     [Decorate(typeof(YourDecorator))] virtual void SomeMethod() // << has to be overridable (can come from an interface) { ... }
  3. 在 Microsoft 的 DI 中注册所有内容:

     services.AddDecor() .AddTransient<YourDecorator>() .AddScoped<YourService>().Decorated();

你可以在这个.Net Fiddle 中玩耍。


披露:我是这个包的作者。

我认为您不需要任何 AOP 框架,.NET 提供的工具刚好足以让您自己完成大部分面向方面的工作。

简短的版本是这样的:

  1. 从您的业务类上的MarshalByRefObject继承。

  2. 为您想要的功能创建一个“方面”。 如在,创建一个继承自RealProxy的类。 例如public class LoggingAspect<T> : RealProxy

  3. 覆盖 Invoke 方法,并实现您的方面代码。 确保将方法调用传递给原始实例。

  4. 创建一个构建器/工厂类,它将创建所需类的实例,例如Entity e = EntityBuilder.WithLogging();

  5. EntityBuilder.Get(...)替换new Entity(...)所有实例。

微软员工自己解释了长版本:

面向方面的编程:使用 RealProxy 类进行面向方面的编程

我不相信你在开发 web api 时需要像 PostSharp 这样的工具或任何其他 AOP 工具。 有许多扩展点,您可以在其中插入日志记录/审计/任何操作。 一个很好的概述是这张海报

您可以创建一个Action Filter 例如,您可以在所有控制器(如果需要)或MessageHandler 中全局注册它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM