2013-04-08 4 views
5

Folgen Sie der Anleitung here, aber anstelle von StructureMap versucht Ninject zu verwenden."MissingMethodException: Kann eine Instanz einer Schnittstelle nicht erstellen" beim Binden der generischen Schnittstelle zum Repository mit Ninject

Es wirft den Fehler "MissingMethodException: Kann eine Instanz einer Schnittstelle erstellen" Fehler jedes Mal, wenn ich versuche, eine IRepository<SomeEntityType> in einen Parameter in einer Aktionsmethode zu injizieren.

Update: Auch geben Bootstrapper.cs nicht gefunden, habe ich das MVC3 Ninject Nuget-Paket.

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 wirkt nur als generische Einschränkung.

+0

Wo ist die Codezeile, die die Ausnahme auslöst? –

+1

@KirkWoll Wie bereits erwähnt, wird dieser Fehler immer dann auftreten, wenn ich versuche, einen IRepository -Parameter in einer Aktionsmethode usw. zu übergeben. Nun klar, weil Ninject nicht richtig konfiguriert ist und nichts bindend ist. Vielleicht etwas mit dem MVC3 Nuget-Paket zu tun, das nicht gut mit MVC4 spielt. – LaserBeak

+1

Sie haben meine Frage nicht beantwortet. Bitte zeigen Sie diese Codezeile an. –

Antwort

1

Diese Art von Fehler zeigt normalerweise an, dass Sie eine andere Version der DLL zur Laufzeit haben, auf die Sie im Projekt verweisen.

Versuchen Sie, alle relevanten DLLs manuell aus Ihren Projektverzeichnissen in Ihr bin-Verzeichnis zu kopieren.

Scheitern, überprüfen Sie this (zugegeben, sehr alt) Post für einige Ideen, wie Sie das Problem zu debuggen.

+0

Dies scheint am wahrscheinlichsten, vor allem, da wir noch den Stacktrace oder die vollständige Nachricht mit uns geteilt haben. –

17

Ich machte den gleichen einfachen Fehler. Ninject fügt Parameter in Ihren Konstruktor ein, aber Sie haben der Index-Controller-Aktion Parameter hinzugefügt.

Es sollte wie folgt aussehen:

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

Sinn?

+2

Genau der gleiche Fehler, den ich gemacht habe :) – BoKDamgaard

+0

Ich auch, genau das gleiche! – Luke

+0

Und ... ich auch;) Danke! –

Verwandte Themen