Exemples d'applications AutoMapper en C#

黄舟
Libérer: 2018-05-15 11:37:47
original
3606 Les gens l'ont consulté

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; }
    }
Copier après la connexion

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);
Copier après la connexion

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 });
Copier après la connexion

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);
Copier après la connexion

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         }
Copier après la connexion

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>(); });
Copier après la connexion

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);
            });
        }
    }
Copier après la connexion

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>();
            });
        }

    }
Copier après la connexion

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();
        }
    }
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal