Tag: #automapper

如何使用AutoMapper基于展平属性的名称查找源属性

我正在使用AutoMapper,我希望它根据映射(展平)目标属性的名称追溯源属性。 这是因为我的MVC控制器具有映射属性的名称,它需要提供给服务调用以进行排序。 服务需要知道映射源自的属性的名称(并且控制器不应该知道它),以便对实际对数据进行排序的存储库执行适当的调用。 例如: [Source.Address.ZipCode]映射到[Destination.AddressZipCode] 然后 将“AddressZipCode”追溯回[Source.Address.ZipCode] 这是AutoMapper可以为我做的事情还是我需要求助于挖掘AutoMapper的映射数据? UPDATE 吉米博加德告诉我,这应该是可能的,但不是以明显的方式。 它需要加载类型映射并通过它。 我已经简要地研究了它,但似乎我需要访问内部类型来获取进行反向映射所需的属性映射信息。 更新2 我决定提供更多细节。 当我加载类型映射时,我发现其中有两个源值解析器用于隐式ZipCode映射: 获取地址的AutoMapper.Internal.PropertyGetter 。 获取ZipCode的AutoMapper.Internal.PropertyGetter 。 当我有一个显式映射(指定了lambda表达式)时,我找不到源值解析器而是自定义解析器: 一个AutoMapper.DelegateBasedResolver我认为它拥有我的显式映射lambda表达式。 不幸的是,这些解析器是内部的,因此我只能通过reflection(我真的不想这样做)或通过更改AutoMapper源代码来访问它们。 如果我可以访问它们,我可以通过遍历值解析器或检查自定义解析器来解决问题,尽管我怀疑它会导致我回到映射lambda表达式,我需要构建unflattened属性名称(实际上是由点分隔的一系列属性名称)。

AutoMapper自动创建createMap

我有一个叫另一个服务的服务。 这两个服务都使用“相同的类”。 这些类被命名为相同且具有相同的属性但具有不同的命名空间,因此我需要使用AutoMapper将其中一种类型映射到另一种类型。 不,这很简单,因为我所要做的就是CreateMap ,但问题是我们有大约数百个类,我手动需要编写CreateMap ,它的工作连接到我。 是不是有任何Auto CreateMapfunction。 因此,如果我说CreateMap(),那么AutoMapper通过组织工作并找到所有类并自动为这些类和它的子类等执行CreateMap等… 希望有一个简单的解决方案,或者我想一些反思可以解决它…

迁移到AutoMapper 5 – 循环引用

尝试在AutoMapper 5中映射之前使用AutoMapper 4工作的东西时,我遇到了System.StackOverflowException 。 谷歌搜索后,我发现它是由循环引用引起的。 AutoMapper文档说: 以前,AutoMapper可以通过跟踪映射的内容来处理循环引用,并在每个映射上检查源/目标对象的本地哈希表,以查看该项是否已映射。 事实certificate,这种跟踪非常昂贵,您需要使用PreserveReferences选择使用圆形贴图才能工作。 或者,您可以配置MaxDepth: // Self-referential mapping cfg.CreateMap().MaxDepth(3); // Circular references between users and groups cfg.CreateMap().PreserveReferences(); 所以我将.MaxDepth(3)添加到我的代码中,它现在再次运行。 但是我没有说明真正的问题是什么以及我通过添加线路做了什么:) 我的问题: 什么意思是关于Category / CategoryDto的’循环引用’? 到底是什么.MaxDepth() ? 为什么样品中使用了3? 什么是.PreserveReferences() ?

如何为使用AutoMapper和dependency injection的.net core 2.0服务编写xUnit测试?

我是.net核心/ C#编程的新手(来自Java) 我有以下Service类,它使用dependency injection来获取AutoMapper对象和数据存储库对象,以用于创建SubmissionCategoryViewModel对象的集合: public class SubmissionCategoryService : ISubmissionCategoryService { private readonly IMapper _mapper; private readonly ISubmissionCategoryRepository _submissionCategoryRepository; public SubmissionCategoryService(IMapper mapper, ISubmissionCategoryRepository submissionCategoryRepository) { _mapper = mapper; _submissionCategoryRepository = submissionCategoryRepository; } public List GetSubmissionCategories(int ConferenceId) { List submissionCategoriesViewModelList = _mapper.Map<IEnumerable, List>(_submissionCategoryRepository.GetSubmissionCategories(ConferenceId) ); return submissionCategoriesViewModelList; } } 我正在使用Xunit编写unit testing。 我无法弄清楚如何为方法GetSubmissionCategories编写unit testing,并让我的测试类提供IMapper实现和ISubmissionCategoryRepository实现。 到目前为止,我的研究表明我可以创建依赖对象的测试实现(例如SubmissionCategoryRepositoryForTesting),或者我可以使用模拟库来创建依赖接口的模拟。 但我不知道如何创建AutoMapper的测试实例或AutoMapper的模拟。 如果你知道任何好的在线教程,详细介绍如何创建一个unit testing,其中被测试的类使用AutoMapper和dependency injection一个很好的数据存储库。 […]

Automapper 5.0全局配置

我在App_Start文件夹中的AutoMapperConfig.cs中使用下面的代码。 我在Global.asax中将其初始化为AutoMapperConfiguration.Configure() 但我无法在我的控制器中使用Mapper.Map 。 它抛出的exception是没有定义映射。 它在以前版本的Mapper.CreateMap中工作,它支持Mapper.CreateMap方法。 我很困惑如何使用MapperConfiguration实例。 public static class AutoMapperConfiguration { public static void Configure() { Mapper.Initialize( cfg => { cfg.AddProfile(); } ); Mapper.AssertConfigurationIsValid(); } } public class HospitalProfile : Profile { protected override void Configure() { var config = new MapperConfiguration( cfg => { cfg.CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id.ToString())); […]

Automapper公约

Automapper可以设置约定,以便在您映射到的实体只是附加了“ViewModel”的情况下,不必手动创建映射。 作为一个例子,我宁愿不必设置以下地图: Mapper.CreateMap(); 我知道如果需要投影我需要创建一个自定义地图,但是有一个创建地图的约定会很好。

在MVC3应用程序的Edit操作方法中使用AutoMapper

这是我的控制器代码,它可以100%正常工作。 但是POST方法没有使用AutoMapper,那不行。 如何在此操作方法中使用AutoMapper? 我正在使用Entity Framework 4和Repository Pattern来访问数据。 public ActionResult Edit(int id) { Product product = _productRepository.FindProduct(id); var model = Mapper.Map(product); return View(model); } [HttpPost] public ActionResult Edit(ProductModel model) { if (ModelState.IsValid) { Product product = _productRepository.FindProduct(model.ProductId); product.Name = model.Name; product.Description = model.Description; product.UnitPrice = model.UnitPrice; _productRepository.SaveChanges(); return RedirectToAction(“Index”); } return View(model); } 如果我使用AutoMapper,entity framework引用将丢失,并且数据不会持久存储到数据库中。 [HttpPost] […]

具有基类和实现的不同配置选项的自动映射器

我有两个类(MVC视图模型),它inheritance自一个抽象基类。 abstract class BaseModel { } class Car : BaseModel { public string Speed { get; set; } } class Camper : BaseModel { public int Beds { get; set; } } 并希望使用基类配置AutoMapper,例如: Mapper.CreateMap(); var someObj = new DataDastination(); Mapper.Map(instanceOfBaseModel, someObj); 在这里我得到错误,因为Automapper没有Car或Camper的配置。 尝试使用以下内容配置Automapper: Mapper.CreateMap() .ForMember(dest => dest.SomeProp, mapper => mapper.MapFrom( …. )); 在MapFrom中,我只看到基类的属性! 如何配置Automapper以使用BaseClass,以及Car和Camper的特定ForMember表达式? 例如,如果它是Car,则从此映射此属性,如果它是Camper,则从其他位置映射此属性。

Automapper – 为什么要使用Mapper.Initialize?

我通常不会在这里问这样的问题,但不幸的是,虽然AutoMapper似乎是一个很好的映射库,但它的文档非常糟糕 – 库的方法没有XML文档,我找到的官方在线文档最多是这样 ,非常活跃。 如果有人有更好的文档,请告诉我。 也就是说,这就是问题:为什么要使用Mapper.Initialize ? 它似乎没有必要,因为你可以立即使用Mapper.CreateMap ,因为没有文档我不知道Initialize的意图。

AutoMapper使用错误的构造函数

今天我使用AutoMapper v1.1升级了一个function齐全的应用程序,现在使用AutoMapper v2.1,我遇到了一些我以前从未遇到的问题。 这是我的代码从Dto映射回Domain对象的示例 public class TypeOne { public TypeOne() { } public TypeOne(TypeTwo two) { //throw ex if two is null } public TypeOne(TypeTwo two, TypeThree three) { //throw ex if two or three are null } public TypeTwo Two {get; private set;} public TypeThree Three {get; private set;} } public class TypeOneDto { […]