AutoMapper 实现(Post 静态 Api)

AutoMapper implementation (Post Static Api)

解决这个问题有些困难。看起来原始设计很容易遵循,但在没有静态 Api 的新设计中,有很多方法可以实现这一点。我找不到任何一种可以理解的方法。大量从头到尾的视频和教程,但代码语法我就是不知道。

我刚开始制作一个新应用程序,如果可能的话,我想从一开始就实现它。

有人可以给出一个详细的例子来说明如何从头开始实现这个吗?我意识到这个例子非常简单,不需要 automapper

使用带代码优先和 EF 的 MVC

模型示例

public class Person
{
    public int id { get; set; }
    public string name { get; set; }
    public DateTime created { get;set;
}

ViewModel 示例

public class User
{        
    public string name { get; set; }        
}

控制器示例-(有点粗糙:))

using AutoMapper;
......
[HttpPost]
public ActionResult AddUser(User user)
{

    Person person = new Person();
    person.name = user.name;
    person.created = DateTime.Now;

    db.Persons.Add(person);
    db.SaveChanges();
    return RedirectToAction("Index");
}

我只想将此示例中的名称字段从 ViewModel 映射到 Model。

在我找到的示例中,我特别困惑的一些点。

在此站点上 > https://github.com/AutoMapper/AutoMapper/wiki/Getting-started

是吗?有没有办法审计我的类型的映射,这是在哪里完成的?即字符串操作。等..

此视频 > https://www.youtube.com/watch?v=-5sZ7hq3J10 让我迷失在 2:46,我还没有使用过存储库,也不确定它们是什么。我认为这是他在审核映射,但对我来说是希腊语。

感谢您清除了我收到的所有混合信息,试图从过多的代码样式和版本更改中学习这一点!


更新

我目前的流程...

  1. 将 class 添加到我的 App_Start 文件夹。我把它命名为MappingConfig.cs
  2. 通过从 MappingConfig.cs 代码中删除“.App_Start”来更正命名空间。
  3. 在 MappingConfig class 内部创建一个方法,用于初始化您的地图。

    我的方法是这样的:

    public static void RegisterMaps() { AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<User, Person>()); }

编辑:我的方法内部是初始化。初始化是只需要做一次的事情吗?如果是这样,我在哪里映射其他类型。我在一些代码示例中看到 "profile" 但没有解释它是什么。 github 网站也没有解释它的用途。

  1. 在你的 controller-ActionResult 中你可以这样映射:

    var person = Mapper.Map<Person>(user);

    编辑:最后一行代码 returns "Missing type map configuration or unsupported mapping."

  2. 现在在"Application_Start()"内部调用class和Global.asax中的方法,其中路由和bunde配置用于在程序开始时初始化地图.我这样在底部添加了它:

    protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); MappingConfig.RegisterMaps(); // Right here }

我相信这就是实施它所需要做的一切?仍在努力拦截正在映射的数据,以便我可以对其进行操作并测试它以查看我是否做对了。

首先,您应该去 Glabal.asax 配置您的映射。执行以下操作:

  Mapper.Initialize(config =>
            {
               config.CreateMap<User, Person>().ReverseMap();                  
            });

ReverseMap() 表示您要双向映射。

这将导致 name 属性 从 UserPerson 的映射。

在您的 Conrtoller 中使用来自 Mapper class 的静态实例进行映射,如下所示:

User userViewModel = Mapper.Map<User>(person);

Mapper.Map 将使用您的配置在这两种类型之间进行映射。

看起来我上面所做的一切在实现方面都是正确的,除了*为了让它工作我必须映射我的每个初始化行方向。这应该在 Github 入门页面上...:/

Mapper.Initialize(cfg => cfg.CreateMap<Source, Dest>();
Mapper.Initialize(cfg => cfg.CreateMap<Dest, Source>();

Mapper.Initialize(cfg => cfg.CreateMap<Source, Dest>().ReverseMap();

只有这样,它才会将我的配置排除在外,而不是直接将代码放在我想使用它的每个文档中(而不是 global.asax)或将配置声明为静态。

有趣的是,Nadeem Khoury 向我提到了这个,但我没有尝试,因为在这个应用程序和这个项目中,我不需要它在两个方向上映射,事实上我不希望它这样做。我最终只是不顾一切地让它工作,并阅读了所有关于堆栈溢出的自动映射器文章,直到并包括这篇 Automapper exception: "Missing type map configuration or unsupported mapping.",其中 Joseph Woodward 说 "You need to add the reverse mapping also"。 需要,关键字与 requirement 足够相似,我什至需要尝试一下。

简而言之,我相信 Jimmy 有一个 bug 需要解决。希望有人会为我报告这个 bug。或者给 Jimmy 发邮件,建议为每个版本整理一份文档,显示实现此功能的最低要求。我在这上面花了 3 天时间,没有时间为我正在构建的应用程序学习有关 AutoMapper 的任何其他内容。看起来它正在获取 ManualMapper。