【问题标题】:Can I make ninject instantiate postsharp aspects?我可以让 ninject 实例化后期锐化方面吗?
【发布时间】:2012-11-01 20:25:52
【问题描述】:

我有一个 asp.net webapi 项目,并且我能够对控制器中的方法进行一些面向方面的编程

[Audit("Getting all foos")]
public IEnumerable<Foo> GetAll()
{
    return _fooService.GetAll();
}

我创建的方面/属性称为审核。我在其他地方使用 ninject 创建对象,但这些方面只是自己创建。

这会导致两个问题,首先我无法将属性注入方面,因此必须在方面中手动创建对象。

其次,它破坏了我的单元测试,因为我无法覆盖创建审计方面的创建行为,因此在测试期间创建了一个真实的而不是模拟的。

我在 IOC 或 ninject 方面没有太多经验,所以说实话我有点搞混了。

有没有办法通过ninject强制创建这些方面?


如果有帮助,我将使用所有库的最新版本。

我也遇到过Ninject Intercept,但这似乎更像是 postharp 的替代品,尽管我可能对此非常错误。

【问题讨论】:

    标签: c# asp.net ninject aop postsharp


    【解决方案1】:

    Postsharp 会在编译后修改您的代码。 Ninject 无法使用这种方法传递依赖关系。但是你可以做一些事情:

    1. 对需要依赖的方面使用 Ninject 拦截。这有不同的工作方式。 Ninject 将动态创建一个装饰器类并在调用前后调用你的方面。这样它就可以传递一些依赖项。

    2. 方面通常用于横切关注点。在这些情况下,为依赖项创建环境上下文是完全合理的。这是一个静态类,只提供一种依赖,例如一个IAuditLog。

    .

    public static class AuditLogProvider
    {
        public static AuditLog 
        {
            get { return autitLog; }
            set {
                    if (this.auditLog != null) throw new InvlaidOperationExcpetion("Audit is already configured"); 
                    this.auditLog = value; 
                }
        }
    }
    

    在您的引导程序中,您现在可以初始化环境上下文:

    AuditLogProvider.AutitLog = kernel.Get<IAuditLog>();
    

    【讨论】:

    • 您对 PostSharp 有很多经验吗?您认为在这种情况下值得使用它还是我们自己编写 Aspects 会更好?
    猜你喜欢
    • 2016-08-12
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2017-12-27
    • 2020-11-21
    相关资源
    最近更新 更多