2013-04-08 43 views
5

遵循指南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; } 
} 
+0

触发异常的代码行在哪里? – 2013-04-08 14:47:01

+1

@KirkWoll如上所述,当我尝试在动作方法等中传递一个IRepository 类型参数时,出现上述错误。现在很明显,因为Ninject没有正确配置,没有任何约束。也许MVC3 Nuget包与MVC4不兼容。 – LaserBeak 2013-04-08 14:55:41

+1

你还没有回答我的问题。请显示该行代码。 – 2013-04-08 14:59:48

回答

1

这种类型的错误通常表明您在运行时有一个不同版本的dll到您在项目中引用的那个版本。

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

如果失败,请检查this(不可否认,非常陈旧)的文章,了解如何调试问题的一些想法。

+0

这似乎是最有可能的,尤其是我们还没有与我们共享堆栈跟踪或完整信息。 – 2013-04-09 12:19:24

17

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

它应该是这样的:

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(); 
    } 
} 

有意义吗?

+2

Excactly同样的错误,我做:) – BoKDamgaard 2014-04-30 12:12:43

+0

我也是,完全一样的东西! – Luke 2014-09-21 18:34:04

+0

而且......我也是;)谢谢! – 2015-11-04 12:37:28