C# 验证Ninject绑定
我有一个WebAPI项目,它使用Ninject进行DI。 我想验证/确认所有绑定都已工作,但我提出的代码有点异味。所以我想知道是否有更好的方法 呼叫者:C# 验证Ninject绑定,c#,dependency-injection,asp.net-web-api2,ninject,C#,Dependency Injection,Asp.net Web Api2,Ninject,我有一个WebAPI项目,它使用Ninject进行DI。 我想验证/确认所有绑定都已工作,但我提出的代码有点异味。所以我想知道是否有更好的方法 呼叫者: private IKernel CreateKernel() { var kernel = new StandardKernel(); kernel.Load(Assembly.GetExecutingAssembly()); GlobalConfiguration.Configu
private IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
GlobalConfiguration.Configuration.DependencyResolver = kernel.Get<System.Web.Http.Dependencies.IDependencyResolver>();
try
{
RegisterServices(kernel);
CheckServices(kernel);
return kernel;
}
catch (ActivationException ex)
{
if (kernel != null)
kernel.Dispose();
log.Fatal(ex);
throw;
}
catch
{
if (kernel != null)
kernel.Dispose();
throw;
}
}
private IKernel CreateKernel()
{
var kernel=新的标准内核();
Load(Assembly.getExecutionGassembly());
GlobalConfiguration.Configuration.DependencyResolver=kernel.Get();
尝试
{
注册服务(内核);
CheckServices(内核);
返回内核;
}
捕获(激活异常)
{
if(内核!=null)
Dispose();
对数致死(ex);
投
}
接住
{
if(内核!=null)
Dispose();
投
}
}
然后:
private void RegisterServices(标准内核)
{
kernel.Bind().ToMethod(context=>()=>newbootstrapper().kernel);
kernel.Bind().To();
剪断以避免太多的代码警告
private void CheckServices(StandardKernel kernel)
{
ILog ilog = kernel.TryGetAndThrowOnInvalidBinding<ILog>();
IDBHandler idbhandler = kernel.TryGetAndThrowOnInvalidBinding<IDBHandler>();
IUserManagementService user = kernel.TryGetAndThrowOnInvalidBinding<IUserManagementService>();
IMassService mass = kernel.TryGetAndThrowOnInvalidBinding<IMassService>();
IPPSService pps = kernel.TryGetAndThrowOnInvalidBinding<IPPSService>();
ilog = null;
idbhandler = null;
ambient = null;
auth = null;
pps = null;
mass = null;
user = null;
log.Info("Ninject Kernel Bindings checked.");
}
private void CheckServices(标准内核)
{
ILog ILog=kernel.TryGetAndThrowOnInvalidBinding();
IDBHandler IDBHandler=kernel.TryGetAndThrowOnInvalidBinding();
IUserManagementService user=kernel.TryGetAndThrowOnInvalidBinding();
IMassService mass=kernel.TryGetAndThrowOnInvalidBinding();
IPPSService pps=kernel.TryGetAndThrowOnInvalidBinding();
ilog=null;
idbhandler=null;
环境=零;
auth=null;
pps=null;
质量=零;
user=null;
Info(“选中了Ninject内核绑定”);
}
我不明白为什么您需要像在生产代码中一样检查绑定。如果绑定检查失败,您将怎么做
相反,我会使用单元测试来检查它们。我使用以下方法,即循环遍历模块中的每个绑定,并尝试实例化它们:
[Test]
public void AllModuleBindingsTest()
{
var kernel = new StandardKernel(new MyNinjectModule())
foreach (var binding in new MyNinjectModule().Bindings)
{
var result = kernel.Get(binding.Service);
Assert.NotNull(result, $"Could not get {binding.Service}");
}
}
嗯,我不明白你为什么要这样做。你正在尝试获取绑定,如果出现问题,就会抛出异常。如果你不这样检查,你的应用程序在尝试获取绑定时会遇到错误,并且还会抛出异常,其中有一个非常详细的转储,说明它为何无法激活。我可以理解d为了验证,你想急切地加载它们,但这似乎没有必要。@JuanR好吧,我想早点发现,因为不清楚绑定失败是后来的原因。好的,当然这可能是其他地方的错误代码造成的。谢谢,我将研究使用Ninject模块方法,并将其移动到我不知道这有多有用。我想这需要你在单元测试项目中注册任何引用的DLL?
[Test]
public void AllModuleBindingsTest()
{
var kernel = new StandardKernel(new MyNinjectModule())
foreach (var binding in new MyNinjectModule().Bindings)
{
var result = kernel.Get(binding.Service);
Assert.NotNull(result, $"Could not get {binding.Service}");
}
}