2

Je me demande comment exactement Ninject gère EF injection DbContext est le scénario suivant.La dépendance injectée DbContext est-elle partagée entre toutes les classes qui l'utilisent dans une instance de requête donnée?

Il y a une classe utilitaire qui prend DbContext comme argument et fait un travail qui exige dbContext:

public class SomeClass : ISomeClass 
{ 
    public SomeClass(MyDbContext context) 
    { 
     //the context is dependency injected 
    } 
} 

Il y a un contrôleur API qui prend DbContext ainsi que d'une instance injectée de ISomeClass (qui nécessite également DbContext)

public class SomeController 
    { 

     public SomeController(MyDbContext context, ISomeClass someClass) 
     { 
      //this controller uses db context for some simple actions and someclass for some more complex actions 
     } 
    } 

option de reliure définie sur:

kernel.Bind<MyDbContext>().ToSelf().InRequestScope();

Maintenant, les questions sont

Lorsque SomeController est instancié, l'instance de SomeClass partage-t-elle la même instance de MyDbContext? En outre, si SomeClass avait injecté SomeSubClass et que MyDbContext était injecté dans le constructeur, serait-ce la même instance de contexte?

Est-ce que ça marche comme ça:

Une demande HTTP est et nécessite contrôleur la création et ses dépendances qui nécessitent DbContext, autant que nous sommes prêts à InRequestScope, permet de retourner la même instance pour les gouverner tout?

Si oui, alors il n'y a pas de différence (DbContext sage) entre un constructeur de contrôleur qui prend le contexte et crée des classes UnitOfWork (pattern from here) comme

public class SomeController(MyDbContext context) 
{ 
    this.someUnitOfWork = new SomeUnitOfWork(context); 
} 

et qui prend l'unité de travail comme paramètre injecté

public class SomeController(MyDbContext context, ISomeUnitOfWork someUnit){} 

Et ici, la seule différence serait le couplage serré pour la mise en œuvre SomeUnitOfWork?

+1

Réponse courte: Basé sur la liaison de InRequestScope, YES – Nkosi

Répondre

3

Une requête HTTP arrive et exige la création contrôleur et ses dépendances qui nécessitent DbContext, autant que nous sommes prêts à InRequestScope, permet de retourner la même instance pour les gouverner tous?

Oui. C'est ce que fait .

https://github.com/ninject/Ninject.Web.Common/wiki/InRequestScope a tous les détails amusants:

La principale raison de l'utilisation InRequestScope() est de faire en sorte qu'une seule instance d'un objet est partagé par tous les objets créés par le noyau Ninject pour que Requête HTTP (par exemple pour partager un objet cher à créer).

+0

Merci beaucoup - pourriez-vous aussi s'il vous plaît un coup d'œil sur l'hypothèse dans mon édition (à propos de l'unité de travail)? – Bartosz

+0

Si vous souhaitez utiliser Unit Of Work, https://stackoverflow.com/questions/11962559/mvc3-ef-unit-of-work-generic-repository-ninject peut vous intéresser. Mais votre solution existante en injectant 'MyDbContext' est correcte. – mjwills