C# 如何使用automapper和constructUsing映射稍微复杂的体系结构

C# 如何使用automapper和constructUsing映射稍微复杂的体系结构,c#,automapper,automapper-6,C#,Automapper,Automapper 6,我有以下无法正确映射的情况: 我从对camunda api的调用中收到以下对象的列表 public class CamundaTask { public string FormKey { get; set; } public string Id { get; set; } public string Name { get; set; } ... } 我想将其映射到我代码中的特定任务(ContactUpdateTask或organizationaquisiti

我有以下无法正确映射的情况:

我从对camunda api的调用中收到以下对象的列表

public class CamundaTask
{
    public string FormKey { get; set; }
    public string Id { get; set; }
    public string Name { get; set; }
    ...
}  
我想将其映射到我代码中的特定任务(
ContactUpdateTask
organizationaquisitiontask
),具体取决于formkey

以下是我的架构:

public class BaseTask
{
    public virtual string TaskType { get; set; }
    public string Id { get; set; }
    public int Priority { get; set; }
    public string Key { get; set; }
    ...
}

public abstract class ProcessTask<TContext> : BaseTask
{
    public TContext TaskContext { get; set; }
}

public class ContactUpdateContext
{
    public Guid PersonId { get; set; }
    public string FullName { get; set; }
}

public class OrganisationAquisitionContext
{
    public Guid OrganisationId { get; set; }
    public string Name { get; set; }
}

public class ContactUpdateTask : ProcessTask<ContactUpdateContext>
{
    public override string TaskType { get => "UpdateContact"; }
}

public class OrganisationAquisitionTask : ProcessTask<OrganisationAquisitionContext>
{
    public override string TaskType { get => "OrganisationAquisition"; } 
}
公共类基任务
{
公共虚拟字符串TaskType{get;set;}
公共字符串Id{get;set;}
公共int优先级{get;set;}
公共字符串密钥{get;set;}
...
}
公共抽象类ProcessTask:BaseTask
{
公共TContext任务上下文{get;set;}
}
公共类ContactUpdateContext
{
公共Guid PersonId{get;set;}
公共字符串全名{get;set;}
}
公共类组织AcquisitionContext
{
公共Guid组织ID{get;set;}
公共字符串名称{get;set;}
}
公共类ContactUpdateTask:ProcessTask
{
公共重写字符串TaskType{get=>“UpdateContact”;}
}
公共类组织获取任务:ProcessTask
{
公共重写字符串TaskType{get=>“OrganizationAquisition”;}
}
我知道如何处理简单的继承和automapper,但是整个TContext让我有点不舒服。 这是我到目前为止所做的,但它会产生以下错误:“映射器未初始化。请使用适当的配置调用初始化。”

CreateMap().ReverseMap();
CreateMap().ReverseMap();
CreateMap().ReverseMap();
CreateMap()
.ForMember(t=>t.FormKey,opt=>opt.MapFrom(p=>p.TaskType))
.ForMember(t=>t.Assignee,opt=>opt.MapFrom(p=>p.Owner))
.ForMember(t=>t.Id,opt=>opt.MapFrom(p=>p.Key))
.ForAllOtherMembers(opt=>opt.Ignore());
CreateMap()
.ForMember(t=>t.TaskType,opt=>opt.MapFrom(p=>p.FormKey))
.ForMember(t=>t.Owner,opt=>opt.MapFrom(p=>p.appendent))
.ForMember(t=>t.Key,opt=>opt.MapFrom(p=>p.Id))
.ForAllOtherMembers(opt=>opt.Ignore());
CreateMap()
.ForMember(t=>t.TaskType,opt=>opt.MapFrom(p=>p.FormKey))
.ForMember(t=>t.Owner,opt=>opt.MapFrom(p=>p.appendent))
.ForMember(t=>t.Key,opt=>opt.MapFrom(p=>p.Id))
.ForAllOtherMembers(opt=>opt.Ignore());
CreateMap()
.ForMember(t=>t.TaskType,opt=>opt.MapFrom(p=>p.FormKey))
.ForMember(t=>t.Owner,opt=>opt.MapFrom(p=>p.appendent))
.ForMember(t=>t.Key,opt=>opt.MapFrom(p=>p.Id))
.ForAllOtherMembers(opt=>opt.Ignore());
CreateMap()
.ConstructUsing((CamundaTask任务)=>
{
开关(task.FormKey.ToLower())
{
案例“更新组织”:
返回Mapper.Map(任务);
案例“contactValidation”:
返回Mapper.Map(任务);
案例“组织收购”:
返回Mapper.Map(任务);
}
返回Mapper.Map(任务);
})
.ForMember(t=>t.TaskType,opt=>opt.MapFrom(p=>p.FormKey))
.ForMember(t=>t.Owner,opt=>opt.MapFrom(p=>p.appendent))
.ForMember(t=>t.Key,opt=>opt.MapFrom(p=>p.Id))
.ForAllOtherMembers(opt=>opt.Ignore());
我使用以下代码行映射:

var tasks = _mapper.Map<IEnumerable<BaseTask>>(camundaTasks)
var tasks=\u mapper.Map(camundaTasks)
其中
camundaTasks
的类型为
IEnumerable


根据
CamundaTask
的formkey,映射“我的任务”列表中包含
ContactUpdateTask
OrganizationAquisitionTask
对象的正确方法是什么?

因此,这里发生的是以非静态方式初始化Automapper(从你原来的帖子中看不清楚,但我可以推断这一点,因为我的评论似乎解决了你的问题),但是你在ConstructUsing方法中静态地使用Automapper

有两种解决方案:

1) 静态使用Automapper

Mapper.Initialize(cfg=> cfg.CreateMap<CamundaTask, BaseTask>());
Mapper.Initialize(cfg=>cfg.CreateMap());
2) 使用ResolutionContext

.ConstructUsing((CamundaTask task, ResolutionContext context) =>
{
    switch (task.FormKey.ToLower())
    {
        case "updateorganization":
            return context.Mapper.Map<ContactUpdateTask>(task);
        case "contactValidation":
            return context.Mapper.Map<ContactValidationTask>(task);
        case "organizationacquisition":
            return context.Mapper.Map<OrganisationAquisitionTask>(task);       
    }

    return context.Mapper.Map<BaseTask>(task);
})
.ConstructUsing((CamundaTask任务,ResolutionContext上下文)=>
{
开关(task.FormKey.ToLower())
{
案例“更新组织”:
返回context.Mapper.Map(任务);
案例“contactValidation”:
返回context.Mapper.Map(任务);
案例“组织收购”:
返回context.Mapper.Map(任务);
}
返回context.Mapper.Map(任务);
})

错误说明了什么?它是否告诉您有关某个特定缺少的映射或其他信息?请尝试使用.ConstructUsing((CamundaTask任务,ResolutionContext context)=>然后,如果您将注释转换为答案(并详细说明它的作用:),您可以调用context.Mapper.MapHi Nico,而不是静态调用Mapper.map)我会把它标记为答案)@dbraillon这个错误并没有说明某个特定的地图丢失了。
.ConstructUsing((CamundaTask task, ResolutionContext context) =>
{
    switch (task.FormKey.ToLower())
    {
        case "updateorganization":
            return context.Mapper.Map<ContactUpdateTask>(task);
        case "contactValidation":
            return context.Mapper.Map<ContactValidationTask>(task);
        case "organizationacquisition":
            return context.Mapper.Map<OrganisationAquisitionTask>(task);       
    }

    return context.Mapper.Map<BaseTask>(task);
})