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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...