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

  • 相关阅读:
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint......
    模拟Executor策略的实现
    设计3D标签
    创建被图像填充的组件
    netty基础09_利用EmbeddedChannel做单元测试
    netty基础08_引导类
    netty基础07_Netty提供的消息处理器和编码解码器
    netty基础06_编码器和解码器
    netty基础05_管道和消息处理器
    netty基础04_数据缓冲区
  • 原文地址:https://www.cnblogs.com/baiyunchen/p/3943942.html
Copyright © 2020-2023  润新知