使用 BindDefaultInterface 时出现 MVC Ninject 绑定错误

本文关键字:Ninject 绑定 错误 MVC BindDefaultInterface 使用 | 更新日期: 2023-09-27 18:17:47

我正在深入研究单元测试/依赖注入/模拟。使用 Ninject,我可以将接口绑定到实现,如下所示NinjectWebCommon.cs

kernel.Bind<IRecipeRepository>().To<RecipeRepository>();

这工作正常。但是,我不想将每个接口单独绑定到具体实现。为了克服这个问题,我对接口使用了标准命名约定(IFoo是类 Foo 的接口(,并尝试使用以下方法为所有使用 Ninject.Extensions.Conventions 的接口提供默认绑定。注意:此代码位于 NinjectWebCommon.csCreateKernel() 方法中:

kernel.Bind(c => c
        .FromThisAssembly()
        .IncludingNonePublicTypes()
        .SelectAllClasses()
        .BindDefaultInterface()
        .Configure(y => y.InRequestScope()));

但是,当我这样做时,我收到以下错误:

Error activating IRecipeRepository
No matching bindings are available, and the type is not self-bindable.
Activation path:
 2) Injection of dependency IRecipeRepository into parameter recipeRepository of constructor of type RecipesController
 1) Request for RecipesController

感谢所有帮助。

编辑:我的控制器的构造函数如下所示:

    private IRecipeRepository recipeRepository;
    private ISizeRepository sizeRepository;
    [Inject]
    public RecipesController(IRecipeRepository recipeRepository, ISizeRepository sizeRepository)
    {
      this.recipeRepository = recipeRepository;
      this.sizeRepository = sizeRepository;
    }

使用 BindDefaultInterface 时出现 MVC Ninject 绑定错误

无法将IRecipeRepository绑定到RecipeRepository的原因是它们与控制器位于不同的程序集中。要解决您的问题,您必须在 NinjectWebCommon.cs 中添加另一个绑定。仅当接口和具体类将位于同一程序集中时,这才有效:

kernel.Bind(c => c
                .FromAssemblyContaining<IRecipeRepository>()
                .IncludingNonePublicTypes()
                .SelectAllClasses()
                .BindDefaultInterface()
                .Configure(y => y.InRequestScope()));

如果具体的实现和接口在不同的项目中,你应该替换.FromAssemblyContaining<IRecipeRepository>().FromAssemblyContaining<RecipeRepository>(),并且应该像一个魅力一样工作。