2013-04-08 10 views
5

Seguendo la guida here, ma invece di StructureMap che tenta di utilizzare Ninject.Ottenere "MissingMethodException: impossibile creare un'istanza di un'interfaccia" quando si associa l'interfaccia generica al repository con Ninject

Si genera l'errore "MissingMethodException: impossibile creare un'istanza di un'interfaccia" ogni volta che si tenta di iniettare un IRepository<SomeEntityType> in un parametro in un metodo di azione.

Aggiornamento: Fornendo anche bootstrapper.cs non trovato, ho utilizzato il pacchetto Ninject 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 solo agisce come un vincolo generico.

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

Dove si trova la riga di codice che attiva l'eccezione? –

+1

@KirkWoll Come indicato, il suddetto errore verrà visualizzato ogni volta che tento di passare un parametro IRepository in un metodo di azione, ecc. Ora chiaramente perché Ninject non è configurato correttamente e nulla è vincolante. Forse qualcosa ha a che fare con il pacchetto MVC3 Nuget che non sta giocando bene con MVC4. – LaserBeak

+1

Non hai risposto alla mia domanda. Si prega di mostrare quella riga di codice. –

risposta

1

Questo tipo di errore di solito indica che si dispone di una versione diversa della DLL in fase di esecuzione a quello che si fa riferimento nel progetto.

Provare a copiare manualmente tutte le DLL rilevanti dalle directory del progetto nella directory bin.

In caso contrario, controllare il post this (certamente, molto vecchio) per alcune idee su come eseguire il debug del problema.

+0

Questo sembra il più probabile, specialmente perché non abbiamo ancora condiviso con noi lo stacktrace o il messaggio completo. –

17

Ho fatto lo stesso semplice errore. Ninject inietta i parametri nel costruttore, ma hai aggiunto parametri all'azione del controller indice.

Esso dovrebbe essere simile a questo:

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

senso?

+2

Esattamente lo stesso errore che ho fatto :) – BoKDamgaard

+0

Anche io, esattamente la stessa cosa !! – Luke

+0

E ... anche io;) Grazie! –

Problemi correlati