我有BusinessLayer, DTO library,DataService, EntityModel(wher EDMX sits)
,DTO库指的是业务层和数据层。我正在尝试在数据层中实现automapper
,想要将实体对象映射到DTO对象并从dataService
库返回DTO。
目前正在这样做
public class DataService
{
private MapperConfiguration config;
public DataService()
{
IMapper _Mapper = config.CreateMapper();
}
public List<Dto.StudentDto> Get()
{
using(var context = new DbContext().GetContext())
{
var studentList = context.Students.ToList();
config = new MapperConfiguration(cfg => {
cfg.CreateMap<Db.Student, Dto.StudentDto>();
});
var returnDto = Mapper.Map<List<Db.Student>, List<Dto.StudentDto>>(studentList);
return returnDto;
}
}
}
如何将所有映射移动到一个类,并且当调用dataserive时,automapper应自动初始化?
答案 0 :(得分:3)
在数据层中使用AutoMapper是一种好习惯吗?
是
如何将所有映射移动到一个类,并且当调用dataserive时,automapper应自动初始化?
您可以创建一个创建映射的静态类:
public static class MyMapper
{
private static bool _isInitialized;
public static Initialize()
{
if (!_isInitialized)
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Db.Student, Dto.StudentDto>();
});
_isInitialized = true;
}
}
}
确保在数据服务中使用此类:
public class DataService
{
public DataService()
{
MyMapper.Initialize();
}
public List<Dto.StudentDto> GetStudent(int id)
{
using (var context = new DbContext().GetContext())
{
var student = context.Students.FirstOrDefault(x => x.Id == id)
var returnDto = Mapper.Map<List<Dto.StudentDto>>(student);
return returnDto;
}
}
}
根据您实际托管DAL的方式,您可以从可执行文件的Initialize()
方法或从您的构造函数之外的其他位置调用自定义映射器类的Main()
方法DataService
上课。
答案 1 :(得分:1)
在AutoMapper.Mapper.CreateMap
上使用OnAppInitialize
。您可以在自己的static
class
中实施课程,以获得更好的风格。
这真的没有更多的魔力 - 因为你只需要注册(CreateMap
)映射一次。
在调用dataserive时自动初始化?
您当然可以在构造函数中注册它。
Here你可以看看另一个样本 - 如何在多种扩展方式中的一种或两种中使用寄存器。
最终AutoMapper
应该让你的生活更轻松而不是更难。在我看来,最好的方法是在一个点上注册所有内容 - 启动应用程序时。
但您也可以按需创建,例如在构造函数中分隔每个CreateMap
。
两种方式 - 只需确保只召唤一次。