激活接口时出错

时间:2017-08-09 18:20:11

标签: c# .net asp.net-mvc visual-studio

我是.NET新手。我正在创建一个互联网商店,但我有一个问题

我的错误:

  

激活IBookRepository时出错没有匹配的绑定   可用,并且类型不可自我绑定。激活路径:2)   将依赖关系IBookRepository注入到参数repo中   BooksController类型的构造函数1)BooksController请求

     

建议:1)确保您已为其定义了绑定   IBookRepository。 2)如果在模块中定义了绑定,请确保   该模块已加载到内核中。 3)确保你有   不小心创建了多个内核。 4)如果你正在使用   构造函数参数,确保参数名称匹配   构造函数参数名称。 5)如果您使用的是自动模块   加载,确保搜索路径和过滤器正确无误。

我在解决方案中使用3个项目我在c#类库域中有一个接口IBookRepository,并在控制器中使用asp.net mvc

IBookRepository:

using Domain.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Domain.Abstract
{
    public interface IBookRepository
    {
        IEnumerable<Book> Books { get; }
    }
}

BooksController中:

using Domain.Abstract;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebUI.Controllers
{
    public class BooksController : Controller
    {
        private IBookRepository repository;
        public BooksController(IBookRepository repo)
        {
            repository = repo;
        }

        public ViewResult List()
        {
            return View(repository.Books);
        }
    }
}

我有所有构造函数参数类型的绑定:

 private static void RegisterServices(IKernel kernel)
    {
        System.Web.Mvc.DependencyResolver.SetResolver(new WebUI.Infrastructure.NinjectDependencyResolver(kernel));
    }

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

因此,您已经完成了依赖注入的第一步,但是您需要告诉您的代码在请求接口时要使用的具体类。为此,您需要为具体类创建绑定

要执行此操作,您需要导航到Ninject绑定文件并添加:

Bind<IBookRepository>().To<NameOfYourClassThatImplementsIBookRepository>();

显然NameOfYourClassThatImplementsIBookRepository应该替换为具体类的实际名称(即实现接口的类)。

答案 1 :(得分:-1)

我不知道Ninject,但是看看上面的代码,BookController构造函数需要一个实现IBookRepository的类实例。考虑构造函数链接或者有一个默认构造函数将实例传递给上面编写的构造函数。

using Domain.Abstract;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebUI.Controllers
{
    public class BooksController : Controller
    {
        private IBookRepository repository;

public BooksController():this(new BookRepository())
        {

        }
        public BooksController(IBookRepository repo)
        {
            repository = repo;
        }

        public ViewResult List()
        {
            return View(repository.Books);
        }
    }
}