在映射过程中添加上下文

时间:2019-02-28 12:53:44

标签: c# automapper

我有一个类,其中包含Thing个集合,可以由它们的Id和它们的ThingCollectionId来标识。

对应的DtoThing仅包含Id,在将PropertyNotInDto映射到{时,我想从全局已知的ThingCollections类中加载DtoThing属性{1}}。

这可以通过将ThingIMappingAction上的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中。

1 个答案:

答案 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字典。