在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; 来改变初始文件夹。