Auto Mapper04(MVC中的配置)

来源:http://www.cnblogs.com/netxiaohui/archive/2016/03/25/5320865.html
-Advertisement-
Play Games

學習如何在MVC項目中配置AutoMapper。 一:首先在MVC項目中引用AutoMapper的DLL文件,接著創建一個介面,這裡面我們需要定義兩個方法,介面裡面的方法只能定義不能實現,也沒有什麼修飾符,實現介面的類必須實現裡面全部的方法。 定義介面IStartupTask,裡面有兩個方法。 pu... ...


學習如何在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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 請求如何進入ASP.NET MVC框架 thx@4littleProgrammer url:http://www.cnblogs.com/4littleProgrammer/p/5317058.html ...
  • 環境:VS2013+MVC5+IIS EXPRESS 問題:如果從Asp.net Web遷移到MVC,可能會遇到需要使原來的鏈接(如http://localhost:12345/old/library.html)可以繼續訪問的情況,而預設情況下,MVC對於html尾碼是不經過路由的,直接給你一個40 ...
  • 我在前面一篇隨筆《Socket開發框架之框架設計及分析》中,介紹了整個Socket開發框架的總體思路,對各個層次的基類進行了一些總結和抽象,已達到重用、簡化代碼的目的。本篇繼續分析其中重要的協議設計部分,對其中消息協議的設計,以及數據的拆包和封包進行了相關的介紹,使得我們在更高級別上更好利用Sock ...
  • 之前我喜歡只是單純的記記筆記,沒有什麼寫文章的習慣,今天也是我一邊研究一邊學習,索性就連過程什麼的都記錄下吧,或許能幫到一兩個朋友呢。 首先,我們來想想什麼叫做單例,顧名思義,單一的一個對象,那麼,單一模式有什麼好處呢?比如說,你的對象只可以實例化一次等等。 先寫一個簡單的測試里的例子吧,比如我建一 ...
  • 本系列目錄: 《1、搜索有聲小說》 《2、分析詳細頁地址》 《3、批量下載mp3》 本篇是大結局,看過前兩篇的放心吧,不會有第四篇了,軟體的下載地址,軟體完成的效果大家自己看吧。 一、查找mp3文件的下載地址 我們首先要獲取其下載地址,在評書的詳細頁中沒有找到,我們進入播放頁面,看看能找到什麼,如下 ...
  • 百度:ef5 mysql http://my.oschina.net/u/170703/blog/210814?p=1 百度:dotconnect for mysql 破解 可以找到極限軟體網站上的 dcmysql的破解版 {"創建 entityFramework 的配置節處理程式時出錯: 未能載入 ...
  • 本篇之所以起這樣一個名字,是因為重點並非如何自定義控制項,不涉及創建CustomControl和UserControl使用的Template和XAML概念。而是通過繼承的方法來擴展一個現有的類,在繼承的子類中增加屬性和擴展行為。 我們在《UWP開發入門(七)——下拉刷新》中提到過嵌套ScrollVie ...
  • 一、Git簡介 1.Git是什麼 Git是分散式版本控制系統 2.Git有什麼特點 (1)Git是分散式的SCM,SVN是集中式的 (2)Git每個歷史版本存儲完整的文件,SVN存儲文件差異 (3)Git可離線完成大部分操作,SVN則相反 (4)Git有著更優雅的分支和合併實現 (5)Git有著更強... ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...