30 votes

Quelle est la meilleure façon d'instancier et de supprimer DbContext dans MVC?

MVC 3 + EF 4.1

Je choisis entre deux approches pour gérer DbContext:

  1. Instancier en Application_BeginRequest , le mettre dans HttpContext.Current.Items et éliminer dans Application_EndRequest .
  2. Créez UnitOfWork jetable (sorte de wrapper pour DbContext ) et démarrez chaque action du contrôleur avec using(var unitOfWork = new UnitOfWork()) { ... }

Partagez votre expérience s'il vous plaît: Laquelle préférez-vous? quels sont les avantages et les inconvénients de chaque approche?

18voto

Eranga Points 21853

Je vous suggère d'utiliser un framework Injection de Dépendance. Vous pouvez inscrire votre DbContext selon la demande

 container.RegisterType<MyDbContext>().InstancePerHttpRequest();

Et de l'injecter comme un paramètre dans le constructeur du contrôleur.

public class MyController : Controller
{
    public MyController(MyDbContext myDbContext)
    {
         _myDbContext = myDbContext;
    }
}

Si le type inscrit implémente IDisposable alors la DI cadre de la jeter quand la demande se termine.

1ère approche: Il est beaucoup plus propre d'utiliser l'ID de cadre que manuellement la mettre en œuvre. En plus de toutes vos demandes peuvent ne pas besoin de votre UoW.

2ème approche: Le contrôleur ne doit pas savoir comment construire votre UoW(DbContext). Le but n'est pas de réduire le couplage entre les composants.

2voto

Chris Yeaste Points 11

Nous utilisons actuellement des référentiels injecté avec UoW (unité de travail) instancié via localisateur de service à partir d'un référentiel de l'usine. L'unité contrôle la durée de vie de cette façon de prendre les travaux à l'extérieur de vous.

Votre particulier la mise en œuvre varie selon si votre utilisation de POCO, Entité Objets, etc..

En fin de compte, vous voulez UoW si vous allez travailler avec plus d'un objectset dans votre contrôleur pour assurer votre simplement en utilisant un contexte. Cela vous permettra de garder vos transactions en échec etc.

Si vous allez utiliser plusieurs objectcontexts (ie. plusieurs EDMX de), vous aurez envie de regarder à l'aide de UoW avec MSDTC...mais c'est probablement plus que ce que vous vouliez savoir. En fin de compte, l'important est de s'assurer que vous venez de instancier ce dont vous avez besoin pour le contrôleur de l'action (c'est à dire une instance du contexte.). Je ne pense pas que j'irais avec Begin_Request, vous pouvez même pas besoin du contexte pour chaque demande.

-1voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X