2013-04-08 9 views
5

Postępując zgodnie z instrukcją here, ale zamiast StructureMap, który próbuje użyć programu Ninject.Uzyskiwanie "MissingMethodException: Nie można utworzyć wystąpienia interfejsu" podczas wiązania ogólnego interfejsu repozytorium z Ninject

Zgłasza błąd "MissingMethodException: Nie można utworzyć wystąpienia interfejsu" za każdym razem, gdy próbuję wprowadzić wartość IRepository<SomeEntityType> do parametru w metodzie akcji.

Aktualizacja: Również nie znaleziono pliku bootstrapper.cs, użyłem pakietu NinVit Nuget MVC3.

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 tylko działa jako ogólny ograniczeń.

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

Gdzie jest wiersz kodu, który uruchamia wyjątek? –

+1

@KirkWoll Jak wspomniano, wspomniany błąd pojawi się w dowolnym momencie, gdy spróbuję przekazać IRepository wpisany parametr w metodzie akcji itp. Teraz wyraźnie, ponieważ Ninject nie jest poprawnie skonfigurowany i nic nie jest wiążące. Być może ma to coś wspólnego z pakietem MVC3 Nuget, który nie gra dobrze z MVC4. – LaserBeak

+1

Nie odpowiedziałeś na moje pytanie. Proszę pokazać ten wiersz kodu. –

Odpowiedz

1

Ten rodzaj błędu zwykle oznacza, że ​​masz inną wersję biblioteki dll w środowisku wykonawczym do tej, do której odwołujesz się w projekcie.

Spróbuj ręcznie skopiować wszystkie odpowiednie biblioteki dll z katalogów projektu do katalogu bin.

W przypadku niepowodzenia sprawdź, czy wpis this (wprawdzie bardzo stary) zawiera kilka pomysłów dotyczących debugowania problemu.

+0

Wydaje się to najbardziej prawdopodobne, szczególnie, że nie mamy jeszcze udostępnionego nam stosu lub pełnej wiadomości. –

17

Zrobiłem ten sam prosty błąd. Ninject wstrzykuje parametry do twojego konstruktora, ale dodajesz parametry do akcji kontrolera indeksów.

To powinno wyglądać tak:

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

sens?

+2

Dokładnie taki sam błąd zrobiłem :) – BoKDamgaard

+0

Ja też, dokładnie to samo !! – Luke

+0

I ... ja też;) Thanx! –

Powiązane problemy