与Microsoft.Extensions.DependencyInjection和asp.net Web API 2的拦截器,可解决诸如日志记录之类的交叉问题

时间:2018-07-07 18:58:17

标签: c# asp.net-web-api dependency-injection aop cross-cutting-concerns

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

对于诸如日志记录之类的横切关注点,我们认为应该考虑面向方面的编程,并且在上面的di中找不到任何支持。

其他DI(例如Castle,Unity和ninject)被排除在基准测试之外。 有没有办法使用其他di框架的注入器(例如城堡动态代理)并将其与microsoft.extensioins.dependencyinjection结合使用?

也欢迎任何有关编织框架的建议。 由于不是免费的,排除了考虑后期处理的问题。

3 个答案:

答案 0 :(得分:2)

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中玩耍。


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

答案 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员工自己可以更好地解释长版:

https://msdn.microsoft.com/en-us/magazine/dn574804.aspx