如果我从特定的Ninject内核实例获取接口类型的绑定,有没有办法验证它的绑定类型(即:InSingletonScope()
,InRequestScope()
)?
(简体)示例:
IKernel kernel = NinjectWebCommon.CreateKernel();
var binding = kernel.GetBindings(typeof(IService)).FirstOrDefault();
var bindingType = binding...??
答案 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);
}
(我已使用FluentAssertions和xunit)
但正如我所说,这是一种愚蠢的行为。为什么要验证绑定?我建议花更多的时间来创建自动化集成/系统测试。这通常是使用DI容器的方式:您不进行单元测试,无论您是否正确配置它们,您都需要通过集成和系统测试进行测试。