1

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

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

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

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

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

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

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


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

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

4

1 回答 1

4

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

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

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

.

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>();
于 2012-11-01T12:25:52.220 回答