无法从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!");
}
}
}
答案 0 :(得分:1)
问题是,Ninject试图绑定你的Program
类,并且因为它没有实现任何接口,你得到System.InvalidOperationException
。如果在Program
类上添加一些虚拟接口,则代码将运行没有问题。
但您可能应考虑是否使用BindDefaultInterface
或BindAllInterfaces
之类的方法。
答案 1 :(得分:1)
问题来自于Ninject捕获了没有实现任何接口的Program
类,并且无法将单个接口绑定到它。
您可以尝试替换该行:
.SelectAllClasses()
带
.SelectAllClasses().Where(t => t.GetInterfaces().Any())