2009-05-29 4 views
0

Salutations, Je cherchais à trier le meilleur moyen de donner accès à mon Entity Manager tout en conservant le contexte ouvert par le biais de la demande pour permettre le chargement tardif. Je vois beaucoup d'exemples comme suit:Accès à Entity Manager dans ASP .NET MVC

public class SomeController 
{ 
    MyEntities entities = new MyEntities(); 
} 

Le problème que je vois avec cette configuration est que si vous avez une couche de classes d'affaires que vous voulez faire des appels en, vous finissez par avoir à passer la gestionnaire en tant que paramètre à ces méthodes, comme si:

public static GetEntity(MyEntities entityManager, int id) 
{ 
     return entityManager.Series.FirstOrDefault(s => s.SeriesId == id); 
} 

il est évident que je suis à la recherche d'une bonne façon, thread-safe, pour fournir le entityManager à la méthode sans le passer. Le chemin doit également être testable à l'unité, mes précédentes tentatives de mise en Session ne fonctionnaient pas pour les tests unitaires.

Je suis actuellement à la recherche de la méthode recommandée pour traiter Entity Framework dans ASP .NET MVC pour une application de niveau entreprise.

Merci à l'avance

Répondre

1

Vous voudrez peut-être regarder le modèle Repository (voici un write up de Repository avec Linq to SQL). L'idée de base serait qu'au lieu de créer une classe statique, vous instanciez une version du référentiel. Vous pouvez passer votre EntityManager en tant que paramètre à la classe dans le constructeur - ou mieux encore, une usine qui peut créer votre EntityManager pour la classe afin qu'elle puisse faire l'instanciation d'unité de travail du gestionnaire.

Pour MVC, j'utilise une classe de contrôleur de base. Dans cette classe, vous pouvez créer votre fabrique de gestionnaires d'entités et en faire une propriété de la classe afin que les classes dérivantes y aient accès. Permettez-lui d'être injecté à partir d'un constructeur mais créé avec la valeur par défaut si l'instance transmise est null. Chaque fois qu'une méthode de contrôleur a besoin de créer un référentiel, elle peut utiliser cette instance pour passer dans le référentiel afin de pouvoir créer le gestionnaire requis. De cette façon, vous vous débarrassez des méthodes statiques et vous permettez que les instances fictives soient utilisées dans vos tests unitaires. En passant dans une fabrique - qui devrait créer des instances qui implémentent des interfaces, btw - vous découpler votre référentiel de la classe de gestionnaire actuelle.

+0

Votre idée est proche de ce que je veux. Cependant, vous n'exposez pas Entity Manager à la couche Business, où je dois l'utiliser. Mais je pense que tu m'as donné un coup de pouce dans la bonne direction – xximjasonxx

2

Entity Framework v1.0 excelle dans les applications Windows Forms où vous pouvez utiliser le contexte de l'objet aussi longtemps que vous le souhaitez. Dans asp.net et mvc en particulier, c'est un peu plus difficile. Ma solution était de faire en sorte que les dépôts ou les gestionnaires d'entités ressemblent davantage à des services avec lesquels MVC pourrait communiquer. J'ai créé une sorte de generic all purpose base repository que je pouvais utiliser à chaque fois que j'en avais envie et que je cessais de trop m'embêter à le faire correctement. J'essaierais d'éviter de laisser le contexte de l'objet ouvert même pour un ms de plus que ce qui est absolument nécessaire dans une application web.

Jetez un coup d'œil à EF4. J'ai commencé à utiliser EF dans un environnement de production quand c'était en version bêta 0.75 ou quelque chose de similaire et que je n'avais pas vraiment de problèmes avec ça, sauf que c'était parfois "dur".

0

Ne pas charger les entités de chargement dans la vue. Ne faites pas d'appels de couche de gestion dans la vue. Chargez toutes les entités dont la vue aura besoin à l'avant dans le contrôleur, calculez toutes les sommes et les moyennes dont la vue aura besoin à l'avant dans le contrôleur, etc. Après tout, c'est ce à quoi sert le contrôleur.

+0

Je ne connais pas l'homme, cela ressemble à énormément de code en double, surtout si vous avez des sections admin et anonymes. Je me sentirais mieux en concentrant le code Get * dans un emplacement central, parce que j'ai besoin de changer la façon dont je le ramène.Je suis d'accord avec vous sur la logique agrégée, si vous ne le faites qu'en un seul endroit. – xximjasonxx

+0

Utilisez l'automapper (http://www.codeplex.com/AutoMapper) pour mapper les parties du domaine dont vous avez besoin aux propriétés dans un DTO que vous envoyez à la vue. – yfeldblum

Questions connexes