如何以及在何处在WPF应用程序中实现automapper

时间:2017-06-25 19:19:14

标签: c# wpf mvvm automapper automapper-6

我有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应自动初始化?

2 个答案:

答案 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

两种方式 - 只需确保只召唤一次。