學習如何在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(); //這個方法中是那些配置文件,把那些全部實現初始化 } }
這裡是老大博客的解釋:<自己在有些地方還是不太懂>
下來只需在程式的啟動文件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
這樣就成功了。以後想要在項目中使用就可以直接定義一個類實現上面的介面,我們就可以實現AutoMapper的轉換。
附件:
“人生無賴” http://www.cnblogs.com/baiyunchen/p/3943942.html