0

我想了解 Automapper 的工作原理。我知道基本思想,在我只是使用所谓ViewModels的发送业务需要的信息之前,从一个或多个数据库表中提取。现在我正在处理一个Automapper使用的遗留项目,也许它提供的不仅仅是这些,但在给定的时刻,我想理解(能够)将我的域对象映射到我的 DTO 对象,反之亦然-versa,我不确定哪一个是正确的方法,因为我做不到。

这是我为测试以下一些基本功能而制作的控制台项目的一个简单示例Automapper

视觉工作室项目

该类DTO_User.cs旨在用于将数据发送到前端。它看起来像这样:

public class DTO_User
{
    public int ID { get; set; }
    public string Name { get; set; }
}

User.cs代表实际域数据的类:

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }
}

所以我正在尝试做的事情。在我的Program.cs我有一个创建一些对象的静态方法User

public static List<Model.User> SeedUsers()
{
    List<Model.User> users = new List<Model.User>()
    {
        new Model.User { ID = 1, Name = "Ivan", PhoneNumber = "1235436"},
        new Model.User { ID = 2, Name = "Petkan", PhoneNumber = "00000000"},
        new Model.User { ID = 3, Name = "Dragan", PhoneNumber = "11111111"},
        new Model.User { ID = 4, Name = "Stoyan", PhoneNumber = "224545346"}
    };
    return users;
}

然后在我的Main方法中,我尝试将这个模拟数据映射到我的 DTO 列表:

    static void Main(string[] args)
    {
        Mapper.CreateMap<DTO.DTO_User, Model.User>();

        //Mock user data as if it's taken from database

        List<Model.User> users = new List<Model.User>();
        users.AddRange(SeedUsers());//Simulate call to database

        //Create List of DTO Users
        List<DTO.DTO_User> dtoUsers = new List<DTO.DTO_User>();

        //Now map the database users to our DTO Users
        foreach (var user in users)
        {
            DTO.DTO_User u = Mapper.Map<Model.User, DTO.DTO_User>(user);
            dtoUsers.Add(u);
        }
    }

我在这里的前循环中得到了错误:

DTO.DTO_User u = Mapper.Map<Model.User, DTO.DTO_User>(user);

说我有一些无效的论点。显然,我并没有真正理解 Automapper 是如何实现实际映射的。上面的代码对我来说是最自然的。我知道这是非常基本的,因此实际的解决方案不会太具有挑战性,但如果有人向我解释我的逻辑在哪里出现问题以及工作代码背后的想法是什么,我将不胜感激。

4

1 回答 1

2

尝试添加额外的映射:

Mapper.CreateMap<Model.User, DTO.DTO_User>();

并将您的 Map 调用更改为以下内容:

DTO.DTO_User u = Mapper.Map<DTO.DTO_User>(user);
于 2015-05-30T18:22:30.170 回答