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 上添加一些虚拟接口,您的代码将 运行 没有问题。
但您可能应该考虑是否使用 BindDefaultInterface
或 BindAllInterfaces
等方法。
问题是因为 Ninject 捕获了你的 Program
class,它没有实现任何接口,并且无法将单个接口绑定到它。
您可以尝试替换以下行:
.SelectAllClasses()
和
.SelectAllClasses().Where(t => t.GetInterfaces().Any())
无法使 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 上添加一些虚拟接口,您的代码将 运行 没有问题。
但您可能应该考虑是否使用 BindDefaultInterface
或 BindAllInterfaces
等方法。
问题是因为 Ninject 捕获了你的 Program
class,它没有实现任何接口,并且无法将单个接口绑定到它。
您可以尝试替换以下行:
.SelectAllClasses()
和
.SelectAllClasses().Where(t => t.GetInterfaces().Any())