J'utilise un contrôleur de base qui expose un DataBase
à laquelle les contrôleurs dérivés peuvent accéder.
public abstract class BaseController : Controller
{
public BaseController()
{
Database = new DatabaseContext();
}
protected DatabaseContext Database { get; set; }
protected override void Dispose(bool disposing)
{
Database.Dispose();
base.Dispose(disposing);
}
}
Tous les contrôleurs de mon application dérivent de BaseController
et sont utilisés comme ceci :
public class UserController : BaseController
{
[HttpGet]
public ActionResult Index()
{
return View(Database.Users.OrderBy(p => p.Name).ToList());
}
}
Maintenant, pour répondre à vos questions :
Quand dois-je créer un nouveau DbContext / dois-je avoir sur que je fais circuler ?
Le contexte doit être créé par demande. Créez le contexte, faites ce que vous avez besoin de faire avec lui puis débarrassez-vous-en. Avec la solution de la classe de base que j'utilise, vous n'avez à vous soucier que de l'utilisation du contexte.
N'essayez pas d'avoir un contexte global (ce n'est pas ainsi que fonctionnent les applications web).
Puis-je avoir un Contexte global que je réutilise dans tous les endroits ?
Non, si vous conservez un contexte, il suivra toutes les mises à jour, les ajouts, les suppressions, etc., ce qui ralentira votre application et pourrait même provoquer l'apparition de bogues assez subtils dans votre application.
Vous devriez probablement choisir soit d'exposer votre référentiel ou votre Contexte à votre contrôleur mais pas les deux. Le fait que deux contextes soient accessibles à partir de la même méthode va entraîner des bogues s'ils ont tous deux des idées différentes sur l'état actuel de l'application.
Personnellement, je préfère exposer DbContext
directement, car la plupart des exemples de référentiels que j'ai vus ne sont que de minces enveloppes autour de DbContext
de toute façon.
Cela entraîne-t-il une baisse des performances ?
La première fois qu'un DbContext
La création d'un contexte est assez coûteuse, mais une fois que cela a été fait, beaucoup d'informations sont mises en cache, de sorte que les instanciations suivantes sont beaucoup plus rapides. Vous êtes plus susceptibles de rencontrer des problèmes de performance en conservant un contexte que d'en instancier un à chaque fois que vous avez besoin d'accéder à votre base de données.
Comment les autres font-ils ?
Ça dépend.
Certaines personnes préfèrent utiliser un cadre d'injection de dépendances pour transmettre une instance concrète de leur contexte à leur contrôleur lors de sa création. Les deux options sont bonnes. La mienne est plus appropriée pour une application à petite échelle où vous savez que la base de données spécifique utilisée ne va pas changer.
certains peuvent prétendre que vous ne peut pas savent cela et c'est pourquoi la méthode d'injection de dépendances est meilleure car elle rend votre application plus résistante aux changements. Mon opinion à ce sujet est que cela ne changera probablement pas (le serveur SQL et Entity Framework ne sont guère obscurs) et que mon temps est mieux employé à écrire le code qui est spécifique à mon application.