使用Ninject将通用接口绑定到存储库时,获取“MissingMethodException:无法创建接口实例”

按照此处的指南,但不是StructureMap尝试使用Ninject。

IRepository我尝试将一个IRepository注入到action方法的参数中时,它都会抛出“MissingMethodException:无法创建接口实例”错误。

更新:还没有找到bootstrapper.cs,我使用了MVC3 Ninject Nuget包。

  public ActionResult Index(IRepository repo) { return View(); } 

NinjectWebCommon.cs

  private static void RegisterServices(IKernel kernel) { string Cname = "VeraDB"; IDbContext context = new VeraContext("VeraDB"); kernel.Bind().To().InRequestScope().WithConstructorArgument("ConnectionStringName", Cname); kernel.Bind(typeof(IRepository)).To(typeof(EFRepository)).WithConstructorArgument("context",context); } 

IRepository

  public interface IRepository where T : class { void DeleteOnSubmit(T entity); IQueryable GetAll(); T GetById(object id); void SaveOrUpdate(T entity); } 

EFRepository

  public class EFRepository : IRepository where T : class, IEntity { protected readonly IDbContext context; protected readonly IDbSet entities; public EFRepository(IDbContext context) { this.context = context; entities = context.Set(); } public virtual T GetById(object id) { return entities.Find(id); } public virtual IQueryable GetAll() { return entities; } public virtual void SaveOrUpdate(T entity) { if (entities.Find(entity.Id) == null) { entities.Add(entity); } context.SaveChanges(); } public virtual void DeleteOnSubmit(T entity) { entities.Remove(entity); context.SaveChanges(); } } 

IEntity只是一个通用约束。

  public interface IEntity { Guid Id { get; set; } } 

我犯了同样的错误。 Ninject将参数注入构造函数,但是您向Index Controller操作添加了参数。

它应该如下所示:

 public class HomeController : Controller { private IRepository _repo; public HomeController(IRepository repo) { _repo= repo; } public ActionResult Index() { ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application. " + _repo.HelloWorld(); return View(); } } 

合理?

这种错误通常表示您在运行时使用的dll版本与您在项目中引用的版本相同。

尝试手动将项目目录中的所有相关dll复制到bin目录。

如果做不到这一点,请查看这个 (不可否认,非常老)的post,了解如何调试问题的一些想法。