C# 具有Microsoft.Extensions.DependencyInjection和asp.net web api 2的拦截器,用于日志记录等横切问题

C# 具有Microsoft.Extensions.DependencyInjection和asp.net web api 2的拦截器,用于日志记录等横切问题,c#,asp.net-web-api,dependency-injection,aop,cross-cutting-concerns,C#,Asp.net Web Api,Dependency Injection,Aop,Cross Cutting Concerns,我们正在asp.net web api2中使用Microsoft.Extensions.DependencyInjection进行依赖项注入 对于诸如日志记录之类的横切关注点,我们认为应该考虑面向方面的编程,但在上述di中找不到任何支持 其他类似DI的castle、Unity和ninject都被选出了,因为它们的基准都很高。 有没有办法使用castle dynamic proxy等其他di框架的注入器,并将其与Microsoft.Extensions.DependencyInjection一起使

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

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

其他类似DI的castle、Unity和ninject都被选出了,因为它们的基准都很高。 有没有办法使用castle dynamic proxy等其他di框架的注入器,并将其与Microsoft.Extensions.DependencyInjection一起使用

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

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


你可以创建一个。你可以(如果需要的话)或者一个例子。

我认为你不需要任何AOP框架,.NET提供了足够的工具,可以自己完成大部分面向方面的工作

简短版本如下:

  • 从业务类上的
    MarshallByRefObject
    继承

  • 为您想要的功能创建一个“方面”。与中一样,创建一个从
    RealProxy
    继承的类。e、 g.
    公共类日志方面:RealProxy

  • 重写Invoke方法,并实现方面代码。确保将方法调用传递给原始实例

  • 创建一个生成器/工厂类,该类将创建所需类的实例,例如,
    Entity e=EntityBuilder.WithLogging()

  • 新实体(…)
    的所有实例替换为
    EntityBuilder.Get(…)

  • 微软员工自己可以更好地解释长版本:

    是围绕
    Castle.Core
    动态代理的包装,旨在简化方法装饰

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

  • 您可以创建一个装饰器:

    公共类yourdecotor:IDecorator
    {    
    public SomeDependency SomeDependency{get;}
    publicYourDecorator(SomeDependency SomeDependency)//支持DI。
    {
    SomeDependency=SomeDependency;
    }
    公用异步任务OnInvoke(调用)
    {
    ...
    等待呼叫。下一步();
    ...
    }
    }
    
  • 装饰你的方法:

    [decoration(typeof(yourdcorator))]
    
    virtual void SomeMethod()//我同意你的看法。但是,日志记录仅限于控制器。如何登录业务层/数据访问层的类,就像任何异常/自定义消息一样,而不直接调用记录器。我没办法,#39;我找不到任何关于此类日志记录/横切问题的信息。我认为Aop可以通过注入日志代码来帮助我。MS.DI非常有限。虽然使用动态侦听库(如CARSITY动态代理)应用截击机并不完全是不可能的,但您应该考虑使用更成熟和功能丰富的DI容器。