代码之家  ›  专栏  ›  技术社区  ›  StayCool

Ninject。扩展。约定不会绑定单个接口

  •  0
  • StayCool  · 技术社区  · 8 年前

    无法从Ninject中获取任何样本。扩展。习俗 Github page 要工作,请使用3.3.0版。 BindDefaultInterface() 没问题,但是 BindSingleInterface() ,如下所示,返回异常 System.InvalidOperationException: 'Sequence contains no elements' .

    我知道一个标题类似的SO问题 Cannot get Ninject.Extensions.Conventions to work . 这是不一样的(而且,我的程序类是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!");
            }
        }
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Jan Muncinsky    8 年前

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

    但也许你应该考虑是否使用 BindDefaultInterface BindAllInterfaces .

        2
  •  1
  •   jbl    8 年前

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

    您可以尝试替换该行:

    .SelectAllClasses()
    

    具有

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