无法使 Ninject.Extensions.Conventions 正常工作
本文关键字:常工作 工作 Conventions Ninject Extensions | 更新日期: 2023-09-27 18:31:18
我一直试图让Ninject.Extensions.TConventionfor (Ninject 3+)工作,但没有运气。我把它归结为一个找到的示例控制台应用程序,我什至无法做到这一点。这是我所拥有的:
class Program
{
static void Main(string[] args)
{
var kernel = new StandardKernel();
kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses()
.BindAllInterfaces());
var output = kernel.Get<IConsoleOutput>();
output.HelloWorld();
var service = kernel.Get<Service>();
service.OutputToConsole();
Console.ReadLine();
}
public interface IConsoleOutput
{
void HelloWorld();
}
public class ConsoleOutput : IConsoleOutput
{
public void HelloWorld()
{
Console.WriteLine("Hello world!");
}
}
public class Service
{
private readonly IConsoleOutput _output;
public Service(IConsoleOutput output)
{
_output = output;
}
public void OutputToConsole()
{
_output.HelloWorld();
}
}
}
我还尝试了FromAssembliesMatching,SelectAllTypes,BindDefaultInterfaces等各种组合,一切都抛出错误激活。没有匹配的绑定可用,并且类型不可自绑定。
只是为了理智,如果我手动绑定:
kernel.Bind<IConsoleOutput>().To<ConsoleOutput>();
一切都很好。很明显,我只是错过了一些东西。
正如 sam 所建议的那样,这是由类型不公开引起的。它们是非公共"程序"类的内部类型。
公开程序或添加.IncludingNonPublicTypes()
:
kernel.Bind(x => x
.FromThisAssembly()
.IncludingNonPublicTypes()
.SelectAllClasses()
.BindAllInterfaces());
(我已经验证了这两种方法都有效,而您的代码无效)。
这是您的官方来源:https://github.com/ninject/ninject.extensions.conventions/blob/master/src/Ninject.Extensions.Conventions.Test/IntegrationTests/NonPublicTypesTests.cs
注意:在旧版本的 Ninject 中,此方法称为 IncludeNonePublicTypes
(无与非)。