获取"MissingMethodException:无法创建接口的实例"使用Ninject将通用接口
本文关键字:接口 quot 使用 Ninject 实例 创建 MissingMethodException 获取 | 更新日期: 2023-09-27 18:08:08
遵循这里的指南,但不是StructureMap尝试使用Ninject。
它抛出"MissingMethodException: Cannot create an instance of an interface"错误每当我试图注入一个IRepository<SomeEntityType>
到一个动作方法的参数
更新:也给bootstrapper.cs没有找到,我使用了MVC3 Ninject Nuget包。
public ActionResult Index(IRepository<SomeEntityType> repo)
{
return View();
}
NinjectWebCommon.cs
private static void RegisterServices(IKernel kernel)
{
string Cname = "VeraDB";
IDbContext context = new VeraContext("VeraDB");
kernel.Bind<IDbContext>().To<VeraContext>().InRequestScope().WithConstructorArgument("ConnectionStringName", Cname);
kernel.Bind(typeof(IRepository<>)).To(typeof(EFRepository<>)).WithConstructorArgument("context",context);
}
IRepository
public interface IRepository<T> where T : class
{
void DeleteOnSubmit(T entity);
IQueryable<T> GetAll();
T GetById(object id);
void SaveOrUpdate(T entity);
}
EFRepository
public class EFRepository<T> : IRepository<T> where T : class, IEntity
{
protected readonly IDbContext context;
protected readonly IDbSet<T> entities;
public EFRepository(IDbContext context)
{
this.context = context;
entities = context.Set<T>();
}
public virtual T GetById(object id)
{
return entities.Find(id);
}
public virtual IQueryable<T> 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将参数注入到构造函数中,但您将参数添加到索引控制器动作中。
应该是这样的:
public class HomeController : Controller
{
private IRepository<SomeEntityType> _repo;
public HomeController(IRepository<SomeEntityType> 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目录。
如果做不到这一点,请查看这篇(诚然,非常旧的)文章,了解如何调试问题。