学习如何在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的转换。
附件: