在哪里放置AutoMapper.CreateMaps?

我在ASP.NET MVC应用程序中使用AutoMapper 。 我被告知应该将AutoMapper.CreateMap移到其他地方,因为它们有很多开销。 我不太清楚如何设计我的应用程序来将这些调用放在一个地方。

我有一个Web层,服务层和数据层。 每个项目都是自己的。 我使用Ninject来DI一切。 我将在Web和服务层中使用AutoMapper

那么你对AutoMapper的CreateMap有什么设置? 你把它放在哪里? 你怎么称呼它?


没关系,只要它是一个静态类。 这与约定有关。

我们的惯例是每个“图层”(web,services,data)都有一个名为AutoMapperXConfiguration.cs文件,其中一个叫做Configure()方法,其中X是图层。

Configure()方法然后调用每个区域的private方法。

以下是我们的Web层配置示例:

public static class AutoMapperWebConfiguration
{
   public static void Configure()
   {
      ConfigureUserMapping();
      ConfigurePostMapping();
   }

   private static void ConfigureUserMapping()
   {
      Mapper.CreateMap<User,UserViewModel>();
   } 

   // ... etc
}

我们为每个“聚合”(User,Post)创建一个方法,所以事情很好地分离。

那么你的Global.asax

AutoMapperWebConfiguration.Configure();
AutoMapperServicesConfiguration.Configure();
AutoMapperDomainConfiguration.Configure();
// etc

它有点像“文字界面” - 不能执行它,但你期望它,所以你可以编码(和重构),如果有必要。

编辑:

只是想我会提到我现在使用AutoMapper配置文件,所以上面的例子变成:

public static class AutoMapperWebConfiguration
{
   public static void Configure()
   {
      Mapper.Initialize(cfg =>
      {
        cfg.AddProfile(new UserProfile());
        cfg.AddProfile(new PostProfile());
      });
   }
}

public class UserProfile : Profile
{
    protected override void Configure()
    {
         Mapper.CreateMap<User,UserViewModel>();
    }
}

更清洁/更强大。


只要您的Web项目引用它所在的程序集,就可以将它放在任何位置。在您的情况下,我会将它放入服务层,因为Web层和服务层可以访问它,如果您决定做一个控制台应用程序或者你正在做一个单元测试项目,映射配置也可以从这些项目中获得。

在您的Global.asax中,您将调用设置所有地图的方法。 见下文:

文件AutoMapperBootStrapper.cs

public static class AutoMapperBootStrapper
{
     public static void BootStrap()
     {  
         AutoMapper.CreateMap<Object1, Object2>();
         // So on...


     }
}

Global.asax应用程序启动

只是打电话

AutoMapperBootStrapper.BootStrap();

现在有些人会反对这种方法违反了一些SOLID原则,他们有有效的论点。 他们在这里阅读。

在Bootstrapper中配置Automapper违反开放原则?


更新:此处发布的方法不再有效,因为SelfProfiler已从AutoMapper v2中删除。

我会采取与Thoai类似的方法。 但是我会使用内置的SelfProfiler<>类来处理地图,然后使用Mapper.SelfConfigure函数进行初始化。

使用这个对象作为源代码:

public class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime BirthDate { get; set; }
    public string GetFullName()
    {
        return string.Format("{0} {1}", FirstName, LastName);
    }
}

而这些作为目的地:

public class UserViewModel
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class UserWithAgeViewModel
{
    public int Id { get; set; }
    public string FullName { get; set; }
    public int Age { get; set; }
}

您可以创建这些配置文件:

public class UserViewModelProfile : SelfProfiler<User,UserViewModel>
{
    protected override void DescribeConfiguration(IMappingExpression<User, UserViewModel> map)
    {
    //This maps by convention, so no configuration needed
    }
}

public class UserWithAgeViewModelProfile : SelfProfiler<User, UserWithAgeViewModel>
{
    protected override void DescribeConfiguration(IMappingExpression<User, UserWithAgeViewModel> map)
    {
    //This map needs a little configuration
        map.ForMember(d => d.Age, o => o.MapFrom(s => DateTime.Now.Year - s.BirthDate.Year));
    }
}

要在你的应用程序中初始化,创建这个类

 public class AutoMapperConfiguration
 {
      public static void Initialize()
      {
          Mapper.Initialize(x=>
          {
              x.SelfConfigure(typeof (UserViewModel).Assembly);
              // add assemblies as necessary
          });
      }
 }

将此行添加到您的global.asax.cs文件中: AutoMapperConfiguration.Initialize()

现在,您可以将您的映射类放置在对您有意义的位置,而不用担心一个单片映射类。

链接地址: http://www.djcxy.com/p/76551.html

上一篇: Where to place AutoMapper.CreateMaps?

下一篇: Common usages for chain of responsibility?