Auto Mapper04(MVC中的配置)

2018-06-18 04:38:17来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

学习如何在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();      //这个方法中是那些配置文件,把那些全部实现初始化
            }
        }

这里是老大博客的解释:<自己在有些地方还是不太懂>

image

下来只需在程序的启动文件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

image

这样就成功了。以后想要在项目中使用就可以直接定义一个类实现上面的接口,我们就可以实现AutoMapper的转换。

附件:

“人生无赖”  http://www.cnblogs.com/baiyunchen/p/3943942.html

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:关于迭代器中IEnumerable与IEnumerator的区别

下一篇:以对象的方式来访问xml数据表(三)