Je souhaite créer une classe de référentiel pour séparer ma logique de données de mes contrôleurs. J'utilise un point de vue pour représenter certaines données qui seront remplies de données de différentes tables. P>
Voici quelques questions que j'ai: p>
getallyl () code>, est-ce que je retourne un iquéryable code> ou iQueryable code>? Si je revenais viewmodels, comment faire face à un getall () code> qui tire des milliers d'enregistrements? li>
- Est-ce que je crée un constructeur pour ma classe de visionnels personnalisée qui prend l'entité comme paramètre pour faire la cartographie? (Je suis toujours inconnu avec Comtableapper, alors il suffit de comprendre comment faire cela à partir d'un point de vue de conception) LI>
ol>
Encore une fois, ma principale préoccupation est une méthode comme getall () code> qui tirerait de nombreux enregistrements. Si je faisais une boucle foreach pour traduire chaque entité en une vue de vue, on dirait que beaucoup de frais généraux. Ma pensée consistait à mettre une référence à l'intérieur de la classe ViewModel personnalisée à la iquéryable code> pour accéder à partir de la collection et que la listeViewModel a simplement des indexeurs ou quelque chose comme ça qui fait référence à la propriété de collecte. p>
3 Réponses :
Il existe de nombreuses façons différentes de le faire, mais de commencer simplement, je retournerais un ienumerable
iquéryable
List<ViewModel> vm = new List<ViewModel>();
foreach (var e in entities)
{
ViewModel v = new ViewModel();
v.something = e.something;
// perform the rest
vm.Add(v);
}
Je pense que vous pourriez avoir un malentendu du modèle de vue et son objectif. Vous n'avez pas besoin de créer un modèle de vue pour chaque entité de votre base de données, comme il semble que vous souhaitiez faire; Vous venez de créer un modèle de vue pour chaque vue que vous souhaitez rendre. D'où le terme "modèle de vue" - il organise les données sous la forme d'un modèle que votre vue peut être fortement saisie.
Vous ne voudriez pas, par exemple, je voudrais créer un modèle de vue séparé pour chaque entité renvoyée par un getall (). Dans un scénario simple d'affichage d'une grille d'affichage de tous les enregistrements, vous aurez probablement besoin d'une image de vue unique avec une propriété: p> Vous remplaceriez ce modèle de vue dans le contrôleur P > public ActionResult SomeAction()
{
var viewmodel = new MyViewModel{AllRecords = GetAll()};
return View(viewModel);
}
1) Pour une méthode comme Getall (), est-ce que je retourne un iquérisable ou iquéry? Si je revenais viewmodels, comment puis-je faire face à un getall () qui tire des milliers d'enregistrements? p>
iQueryable
code>. Le référentiel ne traite pas de modèles de vue. Pensez au référentiel comme quelque chose qui est défini dans une bibliothèque de classe distincte qui ne fait pas référence à votre application ASP.NET MVC, où vit vos modèles de vue. C'est l'application ASP.NET MVC qui fait référence à cette bibliothèque. P> 2) Est-ce que je crée un constructeur pour ma classe ViewModel personnalisée qui prend l'entité comme paramètre pour faire la cartographie? (Je suis toujours inconnu avec Comtableapper, alors il suffit de comprendre comment faire cela à partir d'un point de vue de conception) P> BlockQuote>
Non. Ne créez pas de constructeurs dans vos modèles de vue, surtout si vous souhaitez que vos actions de contrôleur prennent ces modèles d'affichage en tant que paramètres d'action (pensez à une action postale). La raison en est que le classeur de modèle par défaut ne saura plus comment instancier votre modèle de vue et vous devrez écrire des liants de modèle personnalisés. P>
SO MODApper ou mapper manuellement. P>
Exemple avec la cartographie manuelle qui est ce que vous pouviez commencer par: p>
xxx pré> et une fois que vous avez mal compris, ce code passe à Automapper: P >
xxx pré> ou si vous écrivez un filtre d'action personnalisé qui utilise l'événement OnactionExecuted pour extraire le modèle de domaine qui a été transmis à la vue, mappez-le sur le modèle Afficher à l'aide de MOWORAPPER et remplacez le modèle avec Le modèle de vue pour la vue, vous pouvez également simplifier le code répétitif: P>
[AutoMap(typeof(IEnumerable<Entity>), typeof(IEnumerable<MyViewModel>))] public ActionResult SomeAction() { IEnumerable<Entity> entities = Repository.GetAll(); return View(entities); }