zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Siege 3.0 正式版发布,压力测试工具
    Pomm 1.1.2 发布,专为 PG 设计的 ORM 框架
    Whonix 0.5.6 发布,匿名通用操作系统
    国内开源 java cms,Jspxcms 2.0 发布
    EZNamespaceExtensions.Net v2013增加对上下文菜单、缩略图、图标、属性表的支持
    GNU Guile 2.0.9 发布,Scheme 实现
    jdao 1.0.4 发布 轻量级的orm工具包
    OpenSearchServer 1.4 RC4 发布
    Percona Server for MySQL 5.5.3030.2
    Samba 4.0.5 发布
  • 原文地址:https://www.cnblogs.com/netxiaohui/p/5320865.html
Copyright © 2011-2022 走看看