![](/img/trans.png)
[英]Integrating Microsoft.Extensions.DependencyInjection in ASP.NET 4.6.1 project
[英]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.NET是Castle.Core
动态代理的包装器,旨在简化方法装饰。
它与 DI 容器无关,但与 Microsoft 的 DI 集成,后者在Decor.Extensions.Microsoft.DependencyInjection
NuGet 包中可用。
你创建一个装饰器:
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(); ... } }
装饰你的方法:
[Decorate(typeof(YourDecorator))] virtual void SomeMethod() // << has to be overridable (can come from an interface) { ... }
在 Microsoft 的 DI 中注册所有内容:
services.AddDecor() .AddTransient<YourDecorator>() .AddScoped<YourService>().Decorated();
你可以在这个.Net Fiddle 中玩耍。
披露:我是这个包的作者。
我认为您不需要任何 AOP 框架,.NET 提供的工具刚好足以让您自己完成大部分面向方面的工作。
简短的版本是这样的:
从您的业务类上的MarshalByRefObject
继承。
为您想要的功能创建一个“方面”。 如在,创建一个继承自RealProxy
的类。 例如public class LoggingAspect<T> : RealProxy
。
覆盖 Invoke 方法,并实现您的方面代码。 确保将方法调用传递给原始实例。
创建一个构建器/工厂类,它将创建所需类的实例,例如Entity e = EntityBuilder.WithLogging();
用EntityBuilder.Get(...)
替换new Entity(...)
所有实例。
微软员工自己解释了长版本:
我不相信你在开发 web api 时需要像 PostSharp 这样的工具或任何其他 AOP 工具。 有许多扩展点,您可以在其中插入日志记录/审计/任何操作。 一个很好的概述是这张海报
您可以创建一个Action Filter 。 例如,您可以在所有控制器(如果需要)或MessageHandler 中全局注册它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.