c# – 私有成员在API方法调用时突然为空

奇怪的事情:在我的web api中,我使用Ninject解析后,将一个存储库注入到控制器中.存储库存储在私有的只读成员变量中.工作完全正常!当api方法被调用时,我访问变量 – 只看到它突然为null!

伪示例:

public class MyController : ApiController {

  private readonly IRepo _repo;

  public MyController(IRepo repo) {
     Guard.AgainstNullArgument("repo", repo); // guarding to 
                                                          // make sure it's not null
                                                          // (would throw ex)
     _repo = repo; <--- successfully injected
  }

  // calling this method
  public HttpResponseMessage TestMethod() {
     _repo.. <--- suddenly null
  }

}

我将问题追溯到一个小小的细节:控制器中的一个方法(而不是被访问的方法)用一个自定义属性进行注释,该属性指示ninject以工作单元拦截该方法.如果我把属性拿走,一切都会神奇地起作用.

UnitOfWorkAttribute.cs

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Interface)]
public class UnitOfWorkAttribute : Attribute
{
}

AttributeInterceptionStrategy.cs(for ninject)

http://pastebin.com/Qg6tQWye

StartupConfig.cs(组成根,IoC配置等)

http://pastebin.com/fcuSdujj

EfUnitOfWorkInterceptor.cs

public class EfUnitOfWorkInterceptor : SimpleInterceptor
{

    private readonly IUnitOfWork _unitOfWork;

    public EfUnitOfWorkInterceptor(IUnitOfWork unitOfWork)
    {
        Guard.AgainstNullArgument("unitOfWork", unitOfWork);
        _unitOfWork = unitOfWork;
    }

    protected override void AfterInvoke(IInvocation invocation)
    {
        if(!_unitOfWork.Commited)
            _unitOfWork.Commit();

        _unitOfWork.Dispose();
    }
}

编辑

我已经确切地把断点放在各处,弄清楚发生了什么.在控制器上做一个析构函数,以确保整个类没有弄脏,并将readonly成员更改为具有getter / setter的属性,其中我突出显示设置器,以检查是否分配两次.根本没有什么可疑的发生.

编辑2

http://pastebin.com/pQULHLT0

Ninject.Extensions.Interception.dll!Ninject.Extensions.Interception.Injection.Dynamic.DynamicMethodInjector.Invoke(object target = {EIT.Management.Configuration.Web.Api.Controllers.SetupGroupController}, object[] arguments = {object[2]})   Unbekannt
    Ninject.Extensions.Interception.dll!Ninject.Extensions.Interception.Invocation.Invocation.CallTargetMethod()    Unbekannt

编辑3 *

现实世界代码:http://pastebin.com/SqpR9KNR

最佳答案
太奇怪了!我想也许你有另一个没有设置你的_repo的构造函数,然后是一个实例化的控制器的一个新的实例.

转载注明原文:c# – 私有成员在API方法调用时突然为空 - 代码日志