La cartographie du modèle de domaine de visualiser le modèle via AutoMapper ou pas
Je veux utiliser un modèle d'affichage pour l'affichage insted de modèle de domaine. Et je veux personnaliser une propriété à afficher, comment dois-je faire? Et est-ce une bonne pratique d'utiliser AutoMapper pour l'affichage?
Ci-dessous l'exemple de code:
public class BookController : BaseController
{
private IBookService bookService;
public BookController(IBookService bookService)
{
this.bookService = bookService;
}
public ActionResult Details(int id)
{
var book = bookService.GetBookById(id);
return View(Mapper.Map<BookView>(book));
}
}
public class Book
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
public class BookView
{
public int Id { get; set; }
public string Name { get; set; }
}
Si j'utilise un autre moyen, je peux personnaliser la propriété, comme ci-dessous:
public ActionResult Details(int id)
{
var book = bookService.GetBookById(id);
return View(new BookView(book));
}
public class BookView
{
public BookView(Book book){
Name = book.Name +" Decorated";
}
public int Id { get; set; }
public string Name { get; set; }
}
Comment dois-je faire? Et est-ce une bonne pratique d'utiliser AutoMapper pour l'affichage?
Mise à jour
Il semble à l'aide de automapper dans le scénario ci-dessous est plus approprié. Par exemple, l'établissement d'un modèle de vue de modèle de domaine comme ci-dessous. Les opinions?
[HttpPost]
public ActionResult Create(BookView bookView)
{
try
{
var book = Mapper.Map<Book>(bookView); //this is wrong
bookService.SaveOrUpdate(book);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Mise à jour 2
Pour le complexe d'affichage personnalisé via le modèle de vue, je ne veux pas utiliser automapper à l'affichage de la carte logique, en supposant automapper pouvez carte. Parce qu'il mêle à des fins différentes. Par exemple:
Mapper.CreateMap<Book, BookView>()
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name + " this is for display purpose"));
Cependant, l'utilisation du manuel de cartographie comme ci-dessous semble intuitif.
public BookView(Book book){
//mapping here
}
Mise à jour 3
Citation de Jimmy Bogard:
Je pense que l'utilisation AutoMapper parce que vous ne voulez pas utiliser le “=”
l'opérateur est un peu paresseux. Au lieu de cela, nous l'utilisons pour les aplatir et les remodeler,
l'optimisation pour le type de destination de l'environnement. Souvenez-vous, mes
motivation initiale de AutoMapper était:Activer la protection de la couche domaine à partir d'autres couches de la cartographie de
Otd
Merci @AndrewWhitaker pour le lien
Il se compare à d'autres mappages, par exemple domaine de dto, ce qui n'est pas de l'affichage, et plus susceptibles de les nettoyer.
Vous devez créer un entièrement différents pour la cartographie de domaine
-->
DTO. Aussi, vous ne devez pas utiliser AutoMapper à la carte à partir de quelque chose DE domaine.OriginalL'auteur Pingpong | 2013-05-13
Vous devez vous connecter pour publier un commentaire.
C'est un bon cas d'utilisation de AutoMapper (j'ai utilisé de cette façon largement sur de nombreux projets avec succès). En général, il n' pas souhaitez exposer domaine des entités à votre vue (MVC, ce serait exposer votre modèle directement à votre point de vue, ce qui est incorrect).
Vous n'avez pas besoin d'un mappage 1-1 entre l'entité de domaine et viewmodel. Vous pouvez leur donner un aspect complètement différent et personnaliser le mappage dans votre
CreateMap<>
appel. Pour utiliser votre exemple:Pire des cas, vous pouvez fossé automapper pour les cas complexes ou d'utiliser un type personnalisé résolveur avec automapper pour faire le travail.
En fait, c'est de cette façon Jimmy Bogard (l'auteur) recommande l'utilisation de AutoMapper. Il mentionne spécifiquement la cartographie de domaine entités ASP.NET MVC Viewmodel pour une utilisation avec des points de vue fortement typée.
Un autre avantage est que vous pouvez de test de l'unité de mappage des profils. De cette façon, si vous vous retrouvez avec un décalage entre le ViewModel et le Modèle, vous aurez un défaut de l'unité de test.
Mises à jour:
Je pense que la citation que vous avez ajouté à votre question soutient, en outre, à l'aide de AutoMapper pour la cartographie à partir de modèles de domaine à Viewmodel:
Donc, dans mon exemple, vous auriez certainement être l'optimisation pour le type de destination de l'environnement (dans ce cas, un point de vue).
Aussi par le lien que j'ai la référence ci-dessus, vous devriez pas utiliser automapper à la carte à domaine, uniquement de. Avec cela à l'esprit, vous aurez à écrire un peu de logique pour créer/mettre à jour le domaine des entités à partir de ce que vous recevez de la Vue de n'importe quoi. Rappelez-vous que les actions du contrôleur ne doit pas prendre de domaine entités directement (ne vous fiez pas à des données qui proviennent directement de la vue--laissez-le modèle de déterminer si une entité de domaine est valide ou non).
Je ne comprends pas votre dernier paragraphe. Voulez-vous dire que nous ne devrions pas la carte à l'aide de automapper de ViewModel de domaine (POCO)? Si oui, comment faire pour enregistrer la saisie de l'utilisateur (point de Vue) à la base de données (Modèle)? en faisant manuellement la cartographie?
Oui, en faisant un manuel de cartographie. L'idée est que le domaine est trop important d'avoir une cartographie automatique arriver.
Pourquoi le domaine est trop important d'avoir une cartographie automatique arriver? Je confondent encore. J'ai plus de 50 domaines du patient de la table. La plupart des champs doit être rempli lors de l'inscription. Si je ne le manuel de cartographie, quel ennui c'est. Que le but de la automapper pour simplifier la cartographie?
Vous êtes bien sûr libre d'utiliser AutoMapper toutefois vous le souhaitez. Je pense que Jimmy Bogard explique mieux le problème dans l'article que j'ai lié ci-dessus
OriginalL'auteur Andrew Whitaker