【问题标题】:Ninject.Extensions.Conventions won't bind single interfaceNinject.Extensions.Conventions 不会绑定单个接口
【发布时间】:2018-02-11 17:58:58
【问题描述】:

无法从 Ninject.Extensions.Conventions Github page 获取样本之一以工作,版本 3.3.0。 BindDefaultInterface()工作没问题,但是BindSingleInterface(),如下图,返回异常System.InvalidOperationException: 'Sequence contains no elements'

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

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

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

【问题讨论】:

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


【解决方案1】:

问题是,Ninject 尝试同时绑定您的 Program 类,因为它没有实现任何接口,所以您会得到 System.InvalidOperationException。如果您在Program 类上添加一些虚拟接口,您的代码将毫无问题地运行。

但也许您应该考虑是否使用诸如BindDefaultInterfaceBindAllInterfaces之类的方法。

【讨论】:

    【解决方案2】:

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

    您可以尝试替换该行:

    .SelectAllClasses()
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      相关资源
      最近更新 更多