2

我有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;
        }
    }
}

如何将所有映射移动到一个类,并且 automapper 应该在调用 dataserive 时自动初始化?

4

2 回答 2

6

在数据层中使用 AutoMapper 是一种好习惯吗?

是的。

如何将所有映射移动到一个类,并且 automapper 应该在调用 dataserive 时自动初始化?

您可以只创建一个创建映射一次的静态类:

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

于 2017-06-26T10:59:56.453 回答
1

AutoMapper.Mapper.CreateMap上使用OnAppInitialize。您当然可以自己进行实施以static class获得更好的风格。

这真的没有什么魔力了——因为你只需要注册 ( CreateMap) 一次映射。

调用数据服务时自动初始化?

您当然也可以在构造函数中注册它。

在这里您可以查看另一个示例 - 如何以多种扩展方式中的一种或两种方式使用寄存器。

最后AutoMapper应该让你的生活更轻松,而不是更难。在我看来,最好的方法是在启动应用程序时一次性注册所有内容。

但是您也可以按需进行,例如CreateMap在构造函数中分隔每个。

两种方式 - 只要确保你只调用一次。

于 2017-06-25T19:42:36.477 回答