zoukankan      html  css  js  c++  java
  • Auto Mapper01

         在项目中一直在使用Auto Mapper技术,但是只是会简单的使用,对其里面的一些具体的细节和知识点不是很清楚,现在就跟着我从最基础的知识点来重新认识下,AutoMapper技术吧。

         Auto Mapper是一种能够将两个不同类直接做mapping的方法,可以直接从Vmodel到Dmodel做存储的。这个是双向的,老大之前一直用VO(前台View视图)---PO(数据库中的模型,相当于领域模型)来表示,我也觉得这样很容易理解。

        为什么需要Auto Mapper?前台我们可以直接使用实体的模型的,干嘛多此一举呢。

    理由:我们后台的模型是根据数据库中表的结构和业务中需要的内容进行设计的,但是前台我们不可能直接就使用,如果直接使用的话将来后台表结构变化就需要前后一起修改,这样工程量就就大了,现在我们定义前台的Vmodel,我们需要展示什么数据就定义什么,接着我们将我们需要转换的利用Auto Mapper一对一进行转换,要是时间常了业务发生了变化,需要修改数据库的模型,我们直接修改后台的模型就可以解决问题,至于前台的我们就不需要发生太大的改变。这大概就是auto mapper的作用吧。

        DTO(贫血模型):是一种设计模式之间传输数据的软件应该系统。数据传输目标往往是数据访问对象从数据库中检索数据。(这个我看了半天还是不懂,在项目中就只是将实体的Model转换为界面视图的Model,相反也行),下面是我摘抄的,感觉不是很理解。

        表现层与应用层之间是通过数据传输对象(DTO)进行交互的,数据传输对象是没有行为的POCO对象,它的目的只是为了对领域对象进行数据封装,实现层与层之间的数据传递。为何不能直接将领域对象用于数据传递?因为领域对象更注重领域,而DTO更注重数据。不仅如此,由于“富领域模型”的特点,这样做会直接将领域对象的行为暴露给表现层。

         现在先不管是否将领域对象的行为暴露给表现层,这个还不是很理解,先来学习如何进行转换的,具体有哪些步奏需要做。

    1:我们先需要在项目中引用“AutoMapper.dll”

    在程序包管理控制台输入”Install-Package AutoMapper”这样就可以将这个安装到项目中。

    2:配置需要转换的两个类。

    3:验证映射是否正确。

    4:执行映射。

            static void Main(string[] args)
            {
                using(var db=new BlogEntities() )
                {
                    //通过linq来从数据库中取到数据。
                    var blog = from s in db.Blog where s.BlogTitle == "程序" select s;
                    var model = new Model();
                    //配置AutoMapper
                    Mapper.CreateMap<Blog, Model>();
                    //验证AutoMapper映射是否正确
                    Mapper.AssertConfigurationIsValid();
                    foreach (var item in blog)
                    {
                        //执行映射
                        Mapper.Map(item, model);
                        Console.WriteLine(model.BlogContext);
                    }
                    Console.WriteLine("OK");         
                    Console.ReadKey();
                }
            }

    这样我们就可以通过model点击出来博客的内容了。

    *:特定的场景下使用AutoMapper

    我们先看下我们的俩个类

       public  class Model
        {
            public string BlogTitle { get; set; }
            public string BlogContext { get; set; }
            public DateTime CreateDate { get; set; }
            public string BlogAuther { get; set; }
            public int CateId { get; set; }
        }
        /// <summary>
        /// 数据库中的实体类
        /// </summary>
        public partial class Blog
        {
            public int BlogId { get; set; }
            public string BlogTitle { get; set; }
            public string BlogContext { get; set; }
            public System.DateTime CreateDate { get; set; }
            public string BlogAuther { get; set; }
            public int CateId { get; set; }
            public string BlogLong { get; set; }
        
            public virtual BCategorical BCategorical { get; set; }
        }

    这里可以完成映射是应为我们俩个类的中的名字是一样的,我们将其类交给AutoMapper,它会将对应的名称之间进行转换。要是名称不一样,比如下面这样。

            public string BlogCon { get; set; }

    这里我们将Blog的博客内容修改下,就会出现错误。我们可以这样进行手工的配置,让其blogContext将来映射到BlogCon中。

                    //配置AutoMapper
                    Mapper.CreateMap<Blog, Model>().ForMember(x=>x.BlogCon,mo=>mo.MapFrom(x=>x.BlogContext));

    这样就可以了。

    错误提示:

    “AutoMapper.AutoMapperMappingException”类型的第一次机会异常在 AutoMapper.dll 中发生

    这个是经常出现的,最大的可能就是我们VO—PO的名称不一样,或者二者的类型是不一样的,还有就是可能从数据库取到的数据有的值为空。这样就会提示出现错误。

    附件:

         http://www.cnblogs.com/daxnet/archive/2010/07/07/1772584.html

         http://www.cnblogs.com/dudu/archive/2011/12/16/2284828.html

         http://www.cnblogs.com/xishuai/p/3700052.html

  • 相关阅读:
    Elasticsearch集群优化实战
    Elasticsearch跨集群搜索(Cross Cluster Search)
    Elasticsearch集群运维
    Elasticsearch冷热集群搭建
    分布式系统事务一致性
    使用Vertx重构系统小结
    ThreadLocal原理分析与使用场景
    使用Vertx构建微服务
    使用 Python & Flask 实现 RESTful Web API
    Golang简单工厂方法demo
  • 原文地址:https://www.cnblogs.com/netxiaohui/p/5308660.html
Copyright © 2011-2022 走看看