检查Ninject绑定是否为InRequestScope

时间:2014-11-05 11:40:13

标签: c# dependency-injection ninject

如果我从特定的Ninject内核实例获取接口类型的绑定,有没有办法验证它的绑定类型(即:InSingletonScope()InRequestScope())?

(简体)示例:

IKernel kernel = NinjectWebCommon.CreateKernel();
var binding = kernel.GetBindings(typeof(IService)).FirstOrDefault();

var bindingType = binding...??

1 个答案:

答案 0 :(得分:1)

.InRequestScope()本身会调用:IBindingSyntax.InScope(Func<IContext, object> scope);

可以通过以下方式检索ScopeCallback(Func<IContext, object> scope):

 kernel
     .GetBindings(typeof(IService))
     .Single()
     .ScopeCallback

但是比较Func并不是一件好事。感觉非常hackish但我们可以执行以下操作来检索请求范围回调以进行比较:

private Func<IContext, object> RetrieveInRequestScopeCallback()
{
    using (var kernel = new StandardKernel())
    {
        kernel.Bind<object>().ToSelf().InRequestScope();
        return kernel.GetBindings(typeof(object)).Single().ScopeCallback;
    }
}

现在,如下所示的单元测试将通过:

[Fact]
public void Foo()
{
    Func<IContext, object> inRequestScopeCallback = RetrieveInRequestScopeCallback();

    var kernel = new StandardKernel();
    kernel.Bind<string>().ToSelf().InRequestScope();

    IBinding binding = kernel.GetBindings(typeof(string)).Single();
    binding.ScopeCallback.Should().Be(inRequestScopeCallback);
}

(我已使用FluentAssertionsxunit

但正如我所说,这是一种愚蠢的行为。为什么要验证绑定?我建议花更多的时间来创建自动化集成/系统测试。这通常是使用DI容器的方式:您不进行单元测试,无论您是否正确配置它们,您都需要通过集成和系统测试进行测试。