我们在asp.net Web api2中使用Microsoft.Extensions.DependencyInjection进行依赖项注入。
对于诸如日志记录之类的横切关注点,我们认为应该考虑面向方面的编程,并且在上面的di中找不到任何支持。
其他DI(例如Castle,Unity和ninject)被排除在基准测试之外。 有没有办法使用其他di框架的注入器(例如城堡动态代理)并将其与microsoft.extensioins.dependencyinjection结合使用?
也欢迎任何有关编织框架的建议。 由于不是免费的,排除了考虑后期处理的问题。
答案 0 :(得分:2)
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中玩耍。
披露:我是这个软件包的作者。
答案 1 :(得分:0)
在开发Web api时,我不认为您需要诸如PostSharp之类的工具或任何其他OAP工具。有许多扩展点,您可以在其中插入日志记录/审核/任何操作。一个很好的概述是this poster
您可以创建一个Action Filter。例如,您可以register this globally across all controllers(如果需要)或MessageHandler。
答案 2 :(得分:0)
我认为您不需要任何AOP框架,.Net提供了足够的工具来自己完成大多数面向方面的工作。
简短的版本是这个
1)从您的业务类的MarshalByRefObject
继承。
2)为所需的功能创建一个“外观”。与之类似,创建一个从RealProxy
继承的类。例如public class LoggingAspect<T> : RealProxy
。
3)覆盖Invoke方法,并实现您的方面代码。确保将方法调用传递给原始实例。
4)创建一个构建器/工厂类,该类将创建所需类的实例,例如Entity e = EntityBuilder.WithLogging();
5)将所有new Entity(...)
的实例替换为EntityBuilder.Get(...)
。
Microsoft员工自己可以更好地解释长版: