你的位置:首页 > ASP.net教程

[ASP.net教程]Auto Mapper04(MVC中的配置)


学习如何在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