Ninject - 解析每个方法调用的实例

Ninject - Resolve instance per method call

我正在寻找一个解决方案来为每个方法调用解析一个实例。 类似的东西:

public class ServiceAPI
{
    public void ServiceAction()
    { 
        //Call certain repository action
        // Ex: 
        Kernel.Get<RepositoryA>().Insert();

    }
}

public class RepositoryA
{
    public void Insert(object a)
    { 
        //Get logger per service call ?
        var logger = Kernel.Get<RepositoryA>().Insert();

    }
}

我想在每次服务调用时创建一次记录器实例,并将在整个存储库中使用。 我尝试使用 Ninject.Extensions.NamedScope 扩展,但它还没有奏效。 你有什么办法可以处理这种情况吗?

无法通过使用范围机制实现此目的。 (InCallScope()InNamedScope(...)、...)。 范围仅在 ninject 调用类型的构造函数时才相关。 Ninject 永远不能替换已经传递给对象的实例。 如果你想这样做,你必须自己编程。

这里有两种设计方案供您实现所需:

  • 每个方法调用实例化一个对象树。如果有一些服务基础设施,如 WCF 或 Web-API,则可能有挂钩可以用来这样做。
  • 替换代理每次调用方法时应实例化的对象。然后代理可以使用 Ninject 为每个方法调用创建目标并在其上执行方法。

对于代理,您可以使用 Castle DynamicProxy or LinFu. There's also Ninject.Extensions.Interception 等工具,这也可能会有帮助。