2012-04-13 20 views
3

Ich versuche, NopCommerce-Code für den Datenzugriff mit Ninject wiederzuverwenden. Mein F: Wie kann ich einen nicht spezifizierten generischen Typ in ein Objekt injizieren? Ich weiß, dass NopCommerce Autofac verwendet.Ninject und Generic

Meine Objekte Beschreibung: Ich habe Controller (MyController), die Repository (IRepository<T>) enthält. Dieses Repository wird als EfRepository<T> mit dem Befehl ninject eingegeben: kernel.Bind(typeof(IRepository<>)).To(typeof(EfRepository<>)). Die EfRepository hält typeof IDbContext, die generische DbContext ist. EfRepository übergibt es nicht seinen generischen Typ IDbContext, aber es wird immer noch injiziert. Wie funktioniert es mit Ninject?

der Code;

public class MyController : Controller 
{ 
    //a repository --> injected as EfRepository<> using generic injection using the command: 
    //kernel.Bind(typeof(IRepository<>)).To(typeof(EfRepository<>)); 
    private readonly IRepository<Account> _repository; 
} 

public class EfRepository<T> : IRepository<T> where T : BaseEntity 
{ 
    private IDbContext _context; //<<== How do I inject <T> to IDbcontext? 
} 

public interface IDbContext 
{ 
    IDbSet<T> Set<T>() where T : BaseEntity; 
} 

Antwort

2

Da IDbContext nicht generisch ist, können Sie einfach in das Repository injizieren und übergeben T an die allgemeine Set-Methode, wenn Sie es verwenden.

public class EfRepository<T> : IRepository<T> where T : BaseEntity 
{ 
    private IDbContext context; 
    public EfRepository(IDbContext dbContext) 
    { 
     this.context = context; 
    } 

    public void Do() 
    { 
     var dbSet = this.context.Set<T>(); 
    } 
} 
+0

danke für Ihre Antwort. Das ist sehr direkt und einfach. –