Quelles sont les meilleures pratiques pour l'utilisation de l'Unité avec Entity Framework dans une application MVC 4
Je suis aux prises avec Entityframework dans un MVC 4 app, rendant l'utilisation de l'Unité pour l'injection de Dépendances et Automapper pour mappant automatiquement l'objet de DTO. J'ai exécuté à partir d'une question à l'autre, EF se retournent parfois vieux de données, donc je pense que mon dessin n'est pas assez bon.
Que dois-je:
Pour configurer l'Unité que j'ai dans mon Application_Start:
var UnityContainer = UnityConfig.GetConfiguredContainer();
Mapper.Initialize(cfg => cfg.ConstructServicesUsing(type => UnityContainer.Resolve(type)));
UnityContainer.Resolve<AutoMapperConfig>().MapAutoMapper();
...
Dans UnityConfig.RegisterTypes:
container.RegisterType<IMyContext, MyContext>(new ContainerControlledLifetimeManager())
...
Mon repository de l'utilisation du constructeur d'injection des dépendances:
public class MSSQLTenantRepository : IDalTenantRepository
{
private readonly IMyContext _Db;
public MSSQLTenantRepository(IMyContext db)
{
Db = db;
}
...
Et mon contrôleur de l'utilisation du constructeur de l'injection de dépendance trop:
public class TenantController : Controller
{
private readonly ITenantRepository _TenantRepository;
public TenantController(ITenantRepository tenantRepository,
{
_TenantRepository = tenantRepository;
}
...
Automapper config:
public class AutoMapperConfig
{
private readonly ITenantRepository _TenantRepository;
public AutoMapperConfig(ITenantRepository tenantRepository)
{
_TenantRepository = tenantRepository;
}
...
Questions:
Parfois, j'ai des anciennes données, à partir de la première demande.
Lorsque je mettre à jour manuellement les données de SQL server, EF est le retour de l'objet ne reflètent pas les changements
Quand j'ai essayé différentes options j'ai aussi eu erreur sur plusieurs contexte (en raison de Automapper)
Mes questions:
- Quelles sont les meilleures pratiques à l'aide de l'Unité, MVC4, EF 6, référentiels et Automapper?
- Où mettre le code (p. ex. mondiale.asax.c ou dans UnitiConfig.cs de UnityWebApiActivator?
- Ai-je besoin explicite de disposer de la dbcontext, et si oui: Où le faire?
Il y a beaucoup dit sur ce sujet, mais rien couvre toutes les.
Est-ce que cela va fonctionner lorsque mon application a PartialViews? J'ai peur que ce soit le contrôleur dispose le contexte, tandis qu'un autre contrôleur de besoin, ou que les deux contextes de suivre la même entité. J'ai regardé asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/... pour une possible mise en œuvre.
OriginalL'auteur RHAD | 2014-01-27
Vous devez vous connecter pour publier un commentaire.
C'est plutôt mauvais, il fait un singleton de votre contexte. De cette façon, non seulement de multiples demandes partagent le même contexte et vous risquez des problèmes de concurrence, mais aussi la consommation de la mémoire d'un tel contexte partagé se développe sans contrôle.
Plutôt, vous aimeriez avoir un "par la demande" du temps de la vie, où un nouveau contexte est établi pour chaque type de demande:
http://www.wiktorzychla.com/2013/03/unity-and-http-per-request-lifetime.html
et
Je ne suis pas sûr de ce que votre
AutoMapperConfig
classe et à la raison d'un référentiel est injecté dans. C'est une possibilité d'une autre vie problème mais j'ai besoin d'un éclaircissement sur ce point.C'est une autre histoire. Maintenant, votre contexte de gestion de durée de vie fonctionne correctement, cependant, vous mélangez les entités dans des contextes différents (différentes demandes). Ma conjecture est que le
AutoMapperConfig
, quel qu'il soit, encore des approches de la durée de vie de manière incorrecte. Jetez un oeil à ma réponse ici stackoverflow.com/questions/21312428/...Peut-être l'Unité de LifetimeManager a été mis à jour, mais je suis incapable d'utiliser le ci-dessus PerRequest classe. Les remplacements ne sont pas disponibles et ne définit pas de la GetValue et OnCreateLifetimeManager méthodes.
J'ai une question stupide: puis-je utiliser PerRequestLifetimeManager(), et de les injecter DbContext dans un long thread thread d'arrière-plan qui appelle la base de données? Gardez à l'esprit que ce long thread en cours d'exécution est générée dans le début de mon application, et sera en vie aussi longtemps que mon application est en vie.
OriginalL'auteur Wiktor Zychla
Je me suis dit elle avec un peu d'aide de Wiktor.
D'abord: je dois juste une PerRequestLifeTimeManager (comme indiqué par Wiktor Zychla, merci pour ça), qui est disponible dans de l'Unité pour MVC programme d'amorçage.
Deuxième: La ligne:
doit être dans Application_BeginRequest (Globas.asax.cs). Je l'ai mis dans Application_Start, de sorte que ce ne fut résolue qu'une fois au démarrage. La réception d'une demande a été la création d'un nouveau contexte, de sorte qu'il diffère de celui qui Automapper utilise. Lors de la mise en BeginRequest la détermination est effectuée sur chaque demande, avec le même contexte que les référentiels.
Je n'ai pas utilisé une instruction d'utilisation. Autant que je sache, le contexte est détruit après que la demande a été traitée complètement.
OriginalL'auteur RHAD