在哪里放置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