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
这段代码去哪儿了?我要为每种类型制作一个吗
类型映射?
Mapper.Initialize(cfg => cfg.CreateMap<Order, OrderDto>());
Mapper.Initialize(cfg => cfg.CreateMap<User, Person>()); // this is what i did in the controller and Global.asax which isnt valid
这是 Action 结果中的部分吗?是
"user" 在我上面的例子中 "order"?
OrderDto dto = Mapper.Map<OrderDto>(order);
还提到"Where do I configure AutoMapper"
在 Internets 上的示例中,它演示了在 Global.asax 中对我应该创建的名为 "whateverIWant" 的页面进行单一引用,该页面具有配置文件?我猜我把初始化代码(我上面提到的)放在 Global.asax 中 "Application_Start()"?
是吗?有没有办法审计我的类型的映射,这是在哪里完成的?即字符串操作。等..
此视频 > https://www.youtube.com/watch?v=-5sZ7hq3J10 让我迷失在 2:46,我还没有使用过存储库,也不确定它们是什么。我认为这是他在审核映射,但对我来说是希腊语。
感谢您清除了我收到的所有混合信息,试图从过多的代码样式和版本更改中学习这一点!
更新
我目前的流程...
- 将 class 添加到我的 App_Start 文件夹。我把它命名为MappingConfig.cs
- 通过从 MappingConfig.cs 代码中删除“.App_Start”来更正命名空间。
在 MappingConfig class 内部创建一个方法,用于初始化您的地图。
我的方法是这样的:
public static void RegisterMaps()
{
AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<User, Person>());
}
编辑:我的方法内部是初始化。初始化是只需要做一次的事情吗?如果是这样,我在哪里映射其他类型。我在一些代码示例中看到 "profile" 但没有解释它是什么。 github 网站也没有解释它的用途。
在你的 controller-ActionResult 中你可以这样映射:
var person = Mapper.Map<Person>(user);
编辑:最后一行代码 returns "Missing type map configuration or unsupported mapping."
现在在"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
属性 从 User
到 Person
的映射。
在您的 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。
解决这个问题有些困难。看起来原始设计很容易遵循,但在没有静态 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
这段代码去哪儿了?我要为每种类型制作一个吗
类型映射?Mapper.Initialize(cfg => cfg.CreateMap<Order, OrderDto>());
Mapper.Initialize(cfg => cfg.CreateMap<User, Person>()); // this is what i did in the controller and Global.asax which isnt valid
这是 Action 结果中的部分吗?是 "user" 在我上面的例子中 "order"?
OrderDto dto = Mapper.Map<OrderDto>(order);
还提到"Where do I configure AutoMapper"
在 Internets 上的示例中,它演示了在 Global.asax 中对我应该创建的名为 "whateverIWant" 的页面进行单一引用,该页面具有配置文件?我猜我把初始化代码(我上面提到的)放在 Global.asax 中 "Application_Start()"?
是吗?有没有办法审计我的类型的映射,这是在哪里完成的?即字符串操作。等..
此视频 > https://www.youtube.com/watch?v=-5sZ7hq3J10 让我迷失在 2:46,我还没有使用过存储库,也不确定它们是什么。我认为这是他在审核映射,但对我来说是希腊语。
感谢您清除了我收到的所有混合信息,试图从过多的代码样式和版本更改中学习这一点!
更新
我目前的流程...
- 将 class 添加到我的 App_Start 文件夹。我把它命名为MappingConfig.cs
- 通过从 MappingConfig.cs 代码中删除“.App_Start”来更正命名空间。
在 MappingConfig class 内部创建一个方法,用于初始化您的地图。
我的方法是这样的:
public static void RegisterMaps() { AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<User, Person>()); }
编辑:我的方法内部是初始化。初始化是只需要做一次的事情吗?如果是这样,我在哪里映射其他类型。我在一些代码示例中看到 "profile" 但没有解释它是什么。 github 网站也没有解释它的用途。
在你的 controller-ActionResult 中你可以这样映射:
var person = Mapper.Map<Person>(user);
编辑:最后一行代码 returns "Missing type map configuration or unsupported mapping."
现在在"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
属性 从 User
到 Person
的映射。
在您的 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。