Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证Ninject绑定_C#_Dependency Injection_Asp.net Web Api2_Ninject - Fatal编程技术网

C# 验证Ninject绑定

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

我有一个WebAPI项目,它使用Ninject进行DI。 我想验证/确认所有绑定都已工作,但我提出的代码有点异味。所以我想知道是否有更好的方法

呼叫者:

    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}");
    }
}