• Auto Mapper04(MVC中的配置)


    学习如何在MVC项目中配置AutoMapper。

    一:首先在MVC项目中引用AutoMapper的DLL文件,接着创建一个接口,这里面我们需要定义两个方法,接口里面的方法只能定义不能实现,也没有什么修饰符,实现接口的类必须实现里面全部的方法。

    定义接口IStartupTask,里面有两个方法。

        public interface IStartupTask
        { 
            /// <summary>
            /// 这个方法是将来在实现类中定义配置的。
            /// </summary>
            void Execute(); 
            /// <summary>
            /// 利用泛型,本来使用Mapper.Create(),但是现在只需要直接Create()就可以,因为在泛型的T1,T2直接进行来转换。
            /// </summary>
            /// <typeparam name="T1"></typeparam>
            /// <typeparam name="T2"></typeparam>
            void Create<T1,T2>();
        }

    新建一个ModelMapper类实现这个接口。这里将来写我们的配置转换的方法。

        /// <summary>
        /// AutoMapper映射的配置文件,以后只要实现了下面的这个接口就可以用来配置AutoMapper。
        /// </summary>
        public class ModelMapper:IStartupTask
        {
            public void Execute()
            {
                //Create<Book,BookDto>();
                Mapper.CreateMap<BookDto,Book>().ForMember(x=>x.Order,mo=>mo.MapFrom(x=>x.OrderNum));
            }
            /// <summary>
            /// 这个现在才有点思路,就是说利用泛型,看传入的是什么。从而进行转换。
            /// </summary>
            /// <typeparam name="T1"></typeparam>
            /// <typeparam name="T2"></typeparam>
            public virtual void Create<T1,T2>()
            {
                Mapper.CreateMap<T1,T2>();
                Mapper.CreateMap<T2,T1>();
            }
        }

    在Global.asax文件中新建个方法。这里主要是取到实现上面接口的类,这样我们就不必再前面一样每一次执行前面写配置。<这里的代码自己还是看不懂,只知道是这样。下面截图是老大的解释。>

            /// <summary>
            /// AutoMapper
            /// </summary>
            private void ExecuteStartupTasks()
            {
                List<IStartupTask> startupTasks = new List<IStartupTask>();       //申明一个List<>泛型集合
                Assembly asm;            //Assembly:是一个程序集
                string codeBase = HttpRuntime.BinDirectory;        //得到Bin的路劲
                UriBuilder uri = new UriBuilder(codeBase);
                string path = Uri.UnescapeDataString(uri.Path); 
                string bin = Path.GetDirectoryName(path);
                string[] assemblies = Directory.GetFiles(bin, "*.dll");         //加载所有的dll文件,
    
                foreach (String file in assemblies)
                {
                    try
                    {
                        if (File.Exists(file))
                        {
                            asm = Assembly.LoadFrom(file);
                            //寻找实现定义接口的类 <这里才是重头戏>利用linq来实现
                            var query = from t in asm.GetTypes()
                                        where t.IsClass && t.GetInterface(typeof(IStartupTask).FullName) != null
                                        select t;
    
                            // 添加泛型集合到启动任务列表
                            foreach (Type type in query)
                            {
                                startupTasks.Add((IStartupTask)Activator.CreateInstance(type));
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
                foreach (IStartupTask task in startupTasks)
                {
                    task.Execute();      //这个方法中是那些配置文件,把那些全部实现初始化
                }
            }

    这里是老大博客的解释:<自己在有些地方还是不太懂>

    image

    下来只需在程序的启动文件Application_Start()中添加上面的方法就可以,这样就实现了初始化,我们就可以直接在一个地方集中的进行配置。

            /// <summary>
            /// 整个项目的启动方法。
            /// </summary>
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
    
                WebApiConfig.Register(GlobalConfiguration.Configuration);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
                //引用下面的AutoMapper方法。
                ExecuteStartupTasks();
            }

    测试:

    新建了两个类来进行测试。

        public class Book
        {
            public string Name { get; set; }
            public int Order { get; set; }
        }
        public class BookDto
        {
            public string Name { get; set; }
            public int OrderNum { get; set; }
        }

    在Controller中实现bookDto到book的转换。

            public ActionResult Index()
            {
                //在ModelMapper进行了配置,这里直接执行映射就可以。
                var model = Mapper.Map<Book>(new BookDto()
                {
                    Name = "ahui",
                    OrderNum = 100,
                });
                return View(model);
            }

    视图中的代码:

    @{
        ViewBag.Title = "Index";
    }
    @model AutoMapper_Web.Domain.Book
    <h2>Index</h2>
    @Model.Name
    @Model.Order

    image

    这样就成功了。以后想要在项目中使用就可以直接定义一个类实现上面的接口,我们就可以实现AutoMapper的转换。

    附件:

    “人生无赖”  http://www.cnblogs.com/baiyunchen/p/3943942.html

  • 相关阅读:
    移动端布局四: rem适配布局,em和rem介绍,媒体查询显示不同样式,媒体查询调用不同css样式
    移动端布局三: flex布局
    InnoDB存储引擎 (第4章 表)
    InnoDB存储引擎 (第3章 文件)
    《MySQL技术内幕:InnoDB存储引擎》笔记
    InnoDB存储引擎 (第2章 InnoDB存储引擎)
    InnoDB存储引擎 (第1章 MySQL体系结构和存储引擎)
    MySql 技术内幕 (第10章 分区)
    MySql 技术内幕 (第9章 索引)
    MySql 技术内幕 (第6章 聚合和旋转操作)
  • 原文地址:https://www.cnblogs.com/netxiaohui/p/5320865.html
Copyright © 2020-2023  润新知