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

时间:2018-02-11 17:58:59

标签: c# .net inversion-of-control ninject

无法从Ninject.Extensions.Conventions Github page中获取其中一个样本,即3.3.0版。 BindDefaultInterface()没问题,但BindSingleInterface(),如下所示,会返回System.InvalidOperationException: 'Sequence contains no elements'的例外。

我知道同样标题的SO问题 Cannot get Ninject.Extensions.Conventions to work。这是不一样的(同样,我的程序类是公开的,这是该问题的关键)。

这被简化为控制台应用程序,我想我们可以这么做。

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

2 个答案:

答案 0 :(得分:1)

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

但您可能应考虑是否使用BindDefaultInterfaceBindAllInterfaces之类的方法。

答案 1 :(得分:1)

问题来自于Ninject捕获了没有实现任何接口的Program类,并且无法将单个接口绑定到它。

您可以尝试替换该行:

.SelectAllClasses()

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