12

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

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

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

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

4

3 回答 3

4

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

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

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


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

于 2020-03-04T21:38:15.993 回答
2

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

简短的版本是这样的:

  1. 继承MarshalByRefObject您的商务舱。

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

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

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

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

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

Aspect-Oriented Programming : RealProxy 类的面向方面编程

于 2018-07-20T14:57:35.870 回答
0

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

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

于 2018-07-08T07:51:27.217 回答