遵循指南here,而不是尝试使用Ninject的StructureMap。将通用接口绑定到存储库时使用Ninject获取“MissingMethodException:无法创建接口实例”
无论何时我尝试将IRepository<SomeEntityType>
注入操作方法中的参数,它都会抛出“MissingMethodException:无法创建接口的实例”错误。
更新:还给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; }
}
触发异常的代码行在哪里? – 2013-04-08 14:47:01
@KirkWoll如上所述,当我尝试在动作方法等中传递一个IRepository类型参数时,出现上述错误。现在很明显,因为Ninject没有正确配置,没有任何约束。也许MVC3 Nuget包与MVC4不兼容。 –
LaserBeak
2013-04-08 14:55:41
你还没有回答我的问题。请显示该行代码。 – 2013-04-08 14:59:48