问题标签 [automapper-2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
asp.net-mvc - 自动发现自动映射器配置
当你在 MVC 中创建一个控制器时,你不需要为它做任何额外的注册。添加区域也是如此。只要你的 global.asax 有一个 AreaRegistration.RegisterAllAreas() 调用,就不需要额外的设置。
使用 AutoMapper,我们必须使用某种CreateMap<TSource, TDestination>
调用来注册映射。可以使用 static 显式执行这些操作Mapper.CreateMap
,或者通过从类派生AutoMapper.Profile
、覆盖方法并从那里Configure
调用。CreateMap
在我看来,应该能够扫描程序集以查找扩展自的类,Profile
例如 MVC 扫描扩展自Controller
. 有了这种机制,难道不能简单地通过创建一个派生自的类来创建映射Profile
吗?是否存在任何这样的库工具,或者自动映射器中是否内置了一些东西?
c# - AutoMapper 将对象映射到任何继承的目标类型
让我们有一个 DTO 类:
和 viewmodel 类(基础 mvc 项目库):
现在当我像这样为自动映射器创建映射时:
在主 web mvc 项目中,我创建了 UserViewModelBase 的实现,如下所示:
现在当我打电话给这个时:
它失败并出现这样的错误:
缺少类型映射配置或不支持的映射。
UserDto -> UserViewModel
据我了解,这是因为我没有定义 UserDto 和 UserViewModel 之间的直接映射。我想知道是否有某种方法可以告诉 AutoMapper 使用此地图Mapper.CreateMap<UserDto, UserViewModelBase>();
它应该接受任何类型作为继承自UserViewModelBase
.
asp.net-mvc-3 - AutoMapViewResult from put your controllers on a diet video by Jimmy Bogard
I've watched this video a couple of times and really like the custom ActionResult that he creates that handles mapping your source object to your destination object. My problem is a lot of the time my ViewModel's will have a collection property that will be shown as a DropDownList or Listbox in my view but is not available in the source object. Therefore I call another service to retrieve the collection of source objects and then map this to the VeiwModel's property.
Example:
Since Departments are not a property of the Letter object, I must make another query in order to retrieve my options for the DropDownList. This requires another AutoMapper call in order to populate the ViewModel property.
I found the google group for AutoMapper in which Jimmy kind of explains some approaches to this.
Jimmy Bogard's comments on this:
We have a few ways of doing this, depending on how the select list varies. If it's a hard list of items, then often there's some model behind it (like State or Country), so our view model just has that one type and our editor templates takes care of actually pulling the list of states.
If it varies based on some parameter, we have to pass the actual select list down, and basically do a Mapper.Map + post-map manipulation (not in AutoMapper) to fill in the pieces. We use AutoMapper to fill in the major pieces, and the details w/ something else.
Finally, we might have something like a select list provider-type approach in our view:
Html.InputFor(m => m.UserRoles, opt => opt.SelectListProvider());
HTH,
Jimmy
I'm guessing that the EditorFor template would be using the DependencyResolver in order to get the correct service in order to query for your collection that you can generate your DropDownList or ListBox for. I don't know if that code belongs in a server-side code block in the EditorFor template. Something about this just doesn't seem right to me but I could be completely wrong. I always felt that any data access calls would be done in the body of the action and not from a view.
I'm not really sure what he means by his second and third recommendations.
I have to believe someone has solved this problem and has an elegant solution for this. Any recommendations or ideas would be greatly appreciated.
c# - AutoMapper 映射两个共享接口的具体类
我有一个描述两个对象的接口。一个是 DAO,另一个是 BO。所以,这就是它的样子:
我想将 OrderDAO 映射到 OrderBO。我最初的想法是,我可以简单地将接口映射到接口并提供两个具体对象,如下所示:
但是,这并不是开箱即用的。我仍然必须创建一个地图才能将数据从 myOrderDAO 获取到 myOrderBO。
我不确定这对我有多大意义,而且我觉得我“做错了”,事实上。所以我的问题有两个。
- 在上述场景中映射的最佳方式是什么?
- 为什么我需要为同一个界面创建地图?
先谢谢了。
c# - AutoMapper 映射使用接口与具体映射
我认为这是不可能的,但我想这是值得的问题。
我有以下共享接口的类型(我保证,这不是我之前问过的同一个问题)。
然后,我有以下映射:
现在,这就是有趣/令人困惑的地方。
这有效:
这不起作用:
现在,通常我只输入定义了两个接口类型的第一个 Map 语句不会有问题,但我的问题是当 Customer 对象被埋在某个地方时。
这不起作用,因为没有从 ICustomer 到 CustomerSO 的映射,所以配置断言失败。
目前,我正在通过这样做来解决这个问题:
但是,我必须对我们拥有的每个 DTO 类型对象执行此操作,然后很可能会产生级联效果。
我了解从技术上讲,我可以执行以下操作来解决此问题:
但是,在 CustomerBO 中,还有很多其他属性在业务逻辑中使用,而不是在接口中。同样,CustomerSO中有很多属性不在界面中。如果我采用上述路线,我将有大量的 Ignore() 调用,我必须将 CustomerBO 映射到 CustomerSO,然后将 CustomerSO 映射到 CustomerBO,每个都有自己独特的 Ignore 调用列表。使用接口消除了对忽略调用的需要,因为我希望从一个到另一个可见的数据是在接口中定义的。
所以,简而言之,我的问题是:有什么方法可以告诉 AutoMapper 在遇到其中一个实现类时使用接口映射?如果做不到这一点,是否有其他(阅读:更好的)方法比 MapFrom 委托中的 Map 调用根据需要强制执行我的接口到接口映射?
automapper - AutoMapper 自定义类型转换器不起作用
我正在使用Troy Goode 的 PagedList在我的 WebApi 中提供分页信息。他的包返回一个 IPagedList,它实现了 IEnumerable,但还包含自定义属性,例如 IsLastPage、PageNumber、PageCount 等。
当您尝试从 WebApi 控制器方法(例如 GET)返回此类时,将序列化 Enumerable,但不会序列化自定义属性。所以,我想我会使用 AutoMapper 并编写一个自定义类型转换器来转换为这样的类:
由于我将 Enumerable 移动到一个不同的属性中,因此序列化可以完美地处理它。所以,我坐下来写了一个这样的自定义类型转换器:
然后像这样在我的配置中设置它:
但是,当我尝试这样称呼它时:
我收到此错误:
缺少类型映射配置或不支持的映射。
映射类型:IPagedList
1 -> PagedViewModel
1 PagedList.IPagedList1[[Provision.DomainObjects.Department, Provision.DomainObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> Provision.DomainObjects.PagedViewModel
1[[Provision.DomainObjects.Department, Provision.DomainObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]目标路径:PagedViewModel`1
源值:PagedList.StaticPagedList`1[Provision.DomainObjects.Department]
我怎样才能使这项工作?
c# - AutoMapper 不适用于派生类的集合
在处理包含派生类集合的对象时,我遇到了 AutoMapper 2.1.267.0 的问题。我使用以下类在更简单的场景中隔离了我的问题:
和这些映射
这里是初始化
和一个总结一切的图表(红色箭头代表 AutoMapper 映射)
我已将 ContainerA 实例映射到 ContainerB。第一种情况可以正常工作。目标对象已完全填充,如下图所示:
但是如果我添加这个映射
结果是
集合的所有元素的“文本”属性变为空。正如您在图像中看到的,containerB.ClassB 对象的“Text”属性仍然被正确映射。这只发生在集合中。我不知道发生了什么。有什么线索吗?
谢谢
c# - AutoMapper:如果指定类型的源对象为空,则将目标对象的所有属性设置为默认值
如果指定类的源对象为空,是否可以将 AutoMapper 配置为将所有属性设置为默认值?我知道我应该用它Mapper.AllowNullDestinationValues = false;
来为应用程序中的所有类做我想做的事情。这是我用于测试的示例代码,但它不起作用
使用此代码:
asp.net-mvc - 如果我直接从 IEnumerable 映射到 IEnumerable,为什么会得到奇怪的 AutoMapped 结果?
我对 AutoMapper 有一个奇怪的问题。
如果我执行以下操作
如果我期望的话,这可以完美地工作并给我结果。
如果或者我更改要生成的模型,例如:
结果不同,结果总数相同,但许多结果彼此重复,而其他结果则缺失。难道我做错了什么?这不是它应该如何工作的吗。
automapper - 使用xml在运行时动态构建地图?
我有一个 XML 文件,它定义了一个对象的映射——它基本上告诉我映射:
我想在运行时解析它(足够简单),然后以某种方式为此初始化一个自动映射器映射。我已经尝试了几次,但我不知道如何做到这一点.. ForMember 是否有一些过载我迷路了?其他方式来做到这一点?