J'ai récemment découvert une chose intéressante appelée AutoMapper, qui convertit principalement le modèle en DTO en accordant plus d'attention aux données et encapsule raisonnablement les objets de domaine, afin de ne pas surexposer le comportement des objets de domaine à la couche de présentation.
Regardons d'abord quelques exemples, le mappage entre les deux classes.
Définissez d'abord deux classes, Source et DTOSource :
public class Source { public int Id { get; set; } public string Content { get; set; } } public class DTOSource { public int Id { get; set; } public string Content { get; set; } }
Les champs Source et DTOSource sont exactement les mêmes. Voyons comment ils sont convertis via AutoMapper.
Mapper.Initialize(x=>{ x.CreateMap<Source,DTOSource>(); }); Source s = new Source{Id=1,Content="123"}; DTOSource dto = Mapper.Map<DTOSource>(s);
La première étape consiste à établir le mappage entre Source et DTOSource Après avoir initialisé une instance Source, regardez les résultats de l'exécution :
Exécution. terminé Enfin, vous pouvez voir que les données du dto sont les mêmes que les données des s précédemment initialisés. C'est comme copier directement les s dans le dto. Cela est vrai lorsque les noms de champs des deux classes sont les mêmes. si le DTOSource Et si les noms de champs dans sont différents de ceux de Source ? En fait, c'est très simple, il suffit de changer
par un petit bout de code :
On change le nom du champ. du contenu dans DTOSource Changer en Desc. À ce stade, il vous suffit de spécifier les champs lors de l'établissement d'une relation de mappage :
1 Mapper.Initialize(x => { 2 x.CreateMap<Source, DTOSource>().ForMember(c=>c.Desc,q=> { 3 q.MapFrom(z => z.Content); 4 }); 5 });
pour voir les résultats en cours
Vous pouvez voir que les résultats sont les mêmes que lors de l'exécution précédente.
Donc, comment mapper deux listes est en fait très simple. C'est presque la même chose que le code ci-dessus. C'est juste une petite modification dans la dernière étape. Comme le montre le code suivant :
Mapper.Initialize(x => { x.CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => { q.MapFrom(z => z.Content); }); }); s.Add(new Source { Id = 1, Content = "123" }); var dto = Mapper.Map<List<DTOSource>>(s);
Vous pouvez voir qu'à l'exception de la dernière phrase de code, les autres sont presque identiques, sauf que dans la dernière phrase de code, le type de cible est changé en List< ;DTOSource> C'est tout. Jetez un oeil aux résultats en cours d'exécution :
Les résultats sont conformes aux attentes.
Dans les projets réels, cette façon d'écrire ne répond certainement pas aux exigences. Généralement, une encapsulation est effectuée et un nouveau SourceProfile est hérité de Profile :
1 public SourceProfile() 2 { 3 base.CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => { 4 q.MapFrom(z => z.Content); 5 }); 6 }
Toutes les relations de mappage peuvent. être écrit Dans cette classe, vous ne devez l'appeler qu'une seule fois lors de l'initialisation du programme :
1 Mapper.Initialize(x =>{ x.AddProfile<SourceProfile>(); });
La version d'AutoMapper utilisée par le blogueur est la 6.1.1.0, car AutoMapper a supprimé le Profile dans la version 6.0 Configure, donc le La méthode d'écriture est un peu différente de celle des versions inférieures à 6.0. La méthode d'écriture des versions inférieures à 6.0 est la suivante :
public class SourceProfile : Profile { protected override void Configure() { CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => { q.MapFrom(z => z.Content); }); } }
Il suffit d'hériter du profil et de réécrire sa configuration. La méthode d'appel n'est pas très différente de celle ci-dessus. Un ou plusieurs profils peuvent être ajoutés à Mapper.Initialize.
Dans l'application du projet MVC, vous pouvez encapsuler Mapper.Initialize dans une classe
public static class AutoMapperForMvc { public static void Register() { Mapper.Initialize(x => { x.AddProfile<SourceProfile>(); }); } }
puis l'enregistrer une fois dans Global de MVC :
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //注册 AutoMapperForMvc.Register(); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!