Ninject.Extensions.Conventions 不会绑定单一接口

Ninject.Extensions.Conventions won't bind single interface

无法使 Ninject.Extensions.Conventions Github page 中的示例之一正常工作,版本 3.3.0。 BindDefaultInterface()没问题,但是BindSingleInterface(),如下图,returns是System.InvalidOperationException: 'Sequence contains no elements'的一个例外。

我知道类似标题的 SO 问题 Cannot get Ninject.Extensions.Conventions to work。这不一样(另外,我的程序 class 是 public,这是该问题的症结所在)。

这是我认为最简单的控制台应用程序。

using System;
using Ninject;
using Ninject.Extensions.Conventions;

public class Program
{
    static void Main(string[] args)
    {
        var kernel = new StandardKernel();
        kernel.Bind(x => x
           .FromThisAssembly()
           .SelectAllClasses()
           .BindSingleInterface());

        var output = kernel.Get<IConsoleOutput>();
        output.HelloWorld();

        Console.ReadKey();
    }

    public interface IConsoleOutput
    {
        void HelloWorld();
    }

    public class ConsoleOutput : IConsoleOutput
    {
        public void HelloWorld()
        {
            Console.WriteLine("Hello world!");
        }
    }
}

问题是,Ninject 也试图绑定您的 Program class,并且因为它没有实现任何接口,您得到 System.InvalidOperationException。如果您在 Program class 上添加一些虚拟接口,您的代码将 运行 没有问题。

但您可能应该考虑是否使用 BindDefaultInterfaceBindAllInterfaces 等方法。

问题是因为 Ninject 捕获了你的 Program class,它没有实现任何接口,并且无法将单个接口绑定到它。

您可以尝试替换以下行:

.SelectAllClasses()

 .SelectAllClasses().Where(t => t.GetInterfaces().Any())