AutoMapper配置方法

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

原文地址:https://www.cnblogs.com/baiyunchen/p/3943942.html