我有一个类,其中包含Thing
个集合,可以由它们的Id
和它们的ThingCollectionId
来标识。
对应的DtoThing
仅包含Id
,在将PropertyNotInDto
映射到{时,我想从全局已知的ThingCollections
类中加载DtoThing
属性{1}}。
这可以通过将Thing
到IMappingAction
上的DtoMyClass
来实现,但这需要我重建事物列表并将映射代码添加到MyClass
而不是MyDtoClass
。
DtoThing
是否有一种方法可以在使用// sources for mapping
public class MyClass {
public Guid ThingCollectionId {get;set;}
public Dictionary<Thing, MyClassB> Things {get;set;}
}
public class Thing {
public int Id {get;set;}
// other properties
public string PropertyNotInDto {get;set;}
}
// targets for mapping
public class DtoMyClass {
public Guid ThingCollectionId {get;set;}
public Dictionary<DtoThing, DtoMyClassB> Things {get;set;}
}
public class DtoThing {
public int Id {get;set;}
// no other properties are saved in the DtoThing class
}
// global
public class ThingCollections {
public Dictionary<Guid, List<Thing>> ThingCollections {get;}
}
到ThingCollectionId
的映射代码时将DtoThing
添加到上下文中?
我的虚构语法看起来像这样:
Thing
CreateMap<DtoThing, Thing>().AdvancedMapping<ThingMappingAction>();
可以访问ThingMappingAction
。
我当前的方法如下:
ThingCollectionId
但这特别烦人,因为CreateMap<DtoMyClass, MyClass>().AfterMap<MyClassMappingAction>();
...
public MyClassMappingAction : IMappingAction<DtoMyClass, MyClass> {
private ThingCollections ThingCollections {get;}
public MyClassMappingAction(ThingCollections thingCollections){
ThingCollections = thingCollections;
}
public void Process(MyDtoClass source, MyClass target) {
// fix target.Things with ThingCollectionId, Thing.Id and ThingCollections
}
}
在多个属性中使用,并且每个此类实例都需要特殊的代码,因此需要将其添加到Thing
中。
答案 0 :(得分:1)
我通过在ThingCollectionId
的上下文中添加BeforeMap
并使用ITypeConverter<DtoThing, Thing>
来再次访问它来实现这一点。
CreateMap<DtoMyClass, MyClass>().BeforeMap((dto, myclass, context) => context.Items["ThingCollectionId"] = dto.ThingCollectionId);
CreateMap<DtoThing, Thing>().ConvertUsing<ThingTypeConverter>();
public ThingTypeConverter: ITypeConverter<DtoThing, Thing> {
private ThingCollections ThingCollections {get;}
public MyClassMappingAction(ThingCollections thingCollections){
ThingCollections = thingCollections;
}
public Thing Convert(DtoThing source, Thing destination, ResolutionContext context) {
// Get the correct ThingCollection by ThingCollectionId
var thingCollection = ThingCollections[(Guid)context.Items["ThingCollectionId"]];
// Get the correct Thing from the ThingCollection by its Id
return thingCollection.First(t => t.Id == source.Id);
}
}
这将替换先前使用的AfterMap
调用和MyClassMappingAction
。这样,Thing
的映射代码a就不包含在MyClass
的映射中,并且不再需要手动重新创建MyClass.Things
字典。