使用带引用程序集的Ninject和Ninject.Extensions.Conventions

时间:2013-12-03 12:53:55

标签: asp.net-mvc-4 ninject ninject-extensions

我正在尝试使用Ninject项目设置ASP.NET MVC 4

我的解决方案中有3个项目。主要的MVC 4 Web应用程序,引用了2个支持程序集(My.Services.dllMy.Repository.dll)。 My.Services.dll也引用了My.Repository.dll

我添加了Nuget包:Ninject.MVC3(版本3.0.0.6)和Ninject.Extensions.Conventions(版本3.0.0.11)

在主Web应用程序中,我有一个带有以下构造函数的Home controller

public HomeController(IMyService myService)
{
    _myService = myService;
} 

该服务有一个像这样的构造函数:

public MyService(IMyRepository myRepository)
{
    _myRepository = myRepository;
}

在我的NinjectWebCommon文件中,我有:

private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind(x =>
            {
                x.FromThisAssembly().SelectAllClasses().BindDefaultInterface();
                //x.FromAssemblyContaining<MyRepository>().SelectAllClasses().BindDefaultInterface();
                //x.FromAssemblyContaining<MyService>().SelectAllClasses().BindDefaultInterface();
                x.From("My.Repository", "My.Services").SelectAllTypes().BindDefaultInterface();

            });
        }         

如果我运行该应用程序,我会在"Value cannot be null.\r\nParameter name: first"方法的最后一行收到错误(RegisterServices)。

您可以在代码中看到我也尝试x.FromAssemblyContaining<MyRepository>().SelectAllClasses().BindDefaultInterface()无济于事。

顺便提一下,如果我将2种类型MyServiceMyRepository放在Web应用程序而不是附属程序集中并删除RegisterServices的最后一行,那么所有依赖项都会得到解决,一切正常。

1 个答案:

答案 0 :(得分:3)

From...来电中只能包含一个kernel.Bind表达。

请拨打不同FromAssemblyContaining的{​​{1}} 声明,它应该工作正常:

kernel.Bind