Mic*_*ook 3 c# ninject inversion-of-control ninject-extensions
我一直试图让(Ninject 3+)的Ninject.Extensions.Conventions工作,没有运气.我把它归结为一个找到的样本控制台应用程序,我甚至无法做到这一点.这就是我所拥有的:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还尝试了各种组合的 FromAssembliesMatching,SelectAllTypes,BindDefaultInterfaces等.一切都会引发错误激活.没有匹配的绑定可用,并且该类型不可自绑定.
只是为了理智,如果我用以下方法进行手动绑定:
kernel.Bind<IConsoleOutput>().To<ConsoleOutput>();
Run Code Online (Sandbox Code Playgroud)
一切正常.很明显,我只是遗漏了一些东西.
正如山姆所说,它是由不公开的类型造成的.它们是非公共"程序"类的内部类型.
将程序公开或添加.IncludingNonPublicTypes():
kernel.Bind(x => x
.FromThisAssembly()
.IncludingNonPublicTypes()
.SelectAllClasses()
.BindAllInterfaces());
Run Code Online (Sandbox Code Playgroud)
(我已经确认这两个都有效,而你的代码却没有).
这是您的官方来源:https: //github.com/ninject/ninject.extensions.conventions/blob/master/src/Ninject.Extensions.Conventions.Test/IntegrationTests/NonPublicTypesTests.cs
注意:在旧版本的Ninject中调用了此方法IncludeNonePublicTypes(None vs Non).
| 归档时间: |
|
| 查看次数: |
1696 次 |
| 最近记录: |