Nous utilisons ASP.Net MVC + Autofac + EF6. DbContext est encapsulé par UnitOfWork. Nous le créons pour chaque requête http via Autofac. Nous ouvrons également la transaction pour toute la requête http dans le constructeur UnitOfWork.
Le problème est que toutes les requêtes http ne doivent pas être encapsulées dans la transaction. Certains d'entre eux n'ont même pas de demande à DB.
Nous aimerions retarder l'ouverture de la transaction jusqu'à la première demande réelle à DB. Des idées comment on peut le faire?
Nous pouvons remplacer SaveChages et ouvrir une transaction avant de sauvegarder, mais certaines requêtes ne seront pas exécutées de cette manière.
Un autre problème ici: nous utilisons des filtres globaux d'EF Plus pour les entités amovibles souples. Cela fonctionne bien, mais l'initialisation des filtres pour le contexte est plutôt lente. Nous aimerions également le retarder jusqu'à la première demande réelle à DB.
Le problème est que votre UnitOfWork
est injecté dans le contrôleur malgré une action appelée et donc son constructeur est toujours appelé même si vous n'avez pas besoin de l'utiliser. Une solution pourrait être d'utiliser l' injection paresseuse Autofac. Dans ce cas, le UnitOfWork
UnitOfWork est appelé uniquement lorsque son instance est nécessaire
public class SomeController : Controller {
//..
private readonly Lazy<IUnitOfWork> _unitOfWork;
private IAnotherService UnitOfWork => _unitOfWork.Value;
public SomeController(
//..
Lazy<IUnitOfWork> unitOfWork
)
{
//..
_unitOfWork = unitOfWork;
}
//..
public ActionResult ActionNeedsTransaction()
{
//use UnitOfWork
UnitOfWork.SaveChanges();
return Json(value);
}
}