標籤:blog http 使用 io ar for 檔案 art div
在Mvc開發中,我們經常需要構建一個viewModel出來供頁面使用,在PO和VO之間相互傳值的時候,如果實體欄位比較多的時候,那麼傳值將變得異常麻煩,也使得代碼非常的臃腫。AutoMapper可以幫我們自動的映射兩個實體,而且我們還可以自訂一些映射規則,真的是非常的方便。研究了一晚上,找了各種資料,終於把AutoMapper配置出來了,其實配置也沒有那麼難,只是我嘗試映射的時候想映射一個PageList<T>對象,結果嘗試了好長時間,才發現,是PageList<T>貌似不能簡單的映射,具體怎麼映射我沒研究出來,如果誰有好的映射PageList的辦法,歡迎與我分享啊,感激不盡。
下面是參考網上的資料寫的映射配置,這種配置方法只需要在應用程式啟動的時候執行一次,非常的方便。
定義一個介面 IStartupTask
public interface IStartupTask { void Execute(); }
golbal.asax中定義如下一個方法:
private void ExecuteStartupTasks() { List<IStartupTask> startupTasks = new List<IStartupTask>(); Assembly asm; // get path of executing (bin) folder from the current executing assembly string codeBase = HttpRuntime.BinDirectory; UriBuilder uri = new UriBuilder(codeBase); string path = Uri.UnescapeDataString(uri.Path); string bin = Path.GetDirectoryName(path); string[] assemblies = Directory.GetFiles(bin, "*.dll"); foreach (String file in assemblies) { try { if (File.Exists(file)) { asm = Assembly.LoadFrom(file); var query = from t in asm.GetTypes() where t.IsClass && t.GetInterface(typeof(IStartupTask).FullName) != null select t; // add types to list of startup tasks 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(); } }
然後在Application_Start中執行這個方法:
protected void Application_Start() { ExecuteStartupTasks(); }
在Model檔案夾增加一個映射類檔案,實現 IStartupTask介面
public class ModelMapping:IStartupTask { public void Execute() { Create<AdminUserListModel,user>(); } protected virtual void Create<T1, T2>() { Mapper.CreateMap<T1, T2>(); Mapper.CreateMap<T2, T1>(); } }
這種配置方法的大概意思是,在程式啟動的時候,利用反射在Bin目錄下挨個兒找所有的dll檔案,接著在dll中找所有實現了IStartupTask介面的類,然後給初始化,即執行AutoMapper所需要初始化的一些步驟,具體我沒細研究。如果你需要映射的類的dll不在網站的bin目錄下,你可以通過設定 string codeBase = HttpRuntime.BinDirectory; 來改變初始檔案夾。
AutoMapper配置方法