解析 ctor 参数时如何使用值解析器

How to use a value resolver when resolving a ctor parameter

我有一个没有 属性 设置器但有参数化构造函数的实体:

public class Unit
{
    public int Id { get; }

    public Player Owner { get; }

    public Unit(int id, Player owner)
    {
        Id = id;
        Owner = owner;
    }
}

我还有一个用于 AutoMapper 的自定义值解析器,它通过 Id 找到玩家:

public class UnitOwnerResolver : IValueResolver<UnitDto, Unit, Player>
{
    private readonly IPlayerService m_playerService;

    public UnitOwnerResolver(IPlayerService playerService)
    {
        m_playerService = playerService;
    }

    public Player Resolve(UnitDto source, Unit destination, Player destinationMember, ResolutionContext context)
    {
        return m_playerService.GetPlayer(source.OwnerId);
    }
}

问题是,我无法为此实体创建适当的映射配置文件。这就是我想要做的:

CreateMap<UnitDto, Unit>()
    .ForCtorParam("id", options => options.MapFrom(unit => unit.Id))
    .ForCtorParam("owner", options => options.MapFrom<UnitOwnerResolver>();

第三行产生一个错误,因为 ICtorParamConfigurationExpression.MapFrom 方法没有重载取值解析器:

No overload for method 'MapFrom' takes 0 arguments

我希望它能像使用 ForMember 方法一样工作,其中有这样的重载:

有人可以建议我如何使用 AutoMapper、ctor 映射和值解析器创建实体的实例吗?当然,我可以创建一个工厂,但如果可能的话,我想坚持映射以在整个应用程序中保留单一方法。

谢谢。

您可以通过一些黑客攻击来完成。您必须使用可以通过解析上下文 Options:

访问的 ServiceCtor 函数解决自己的服务问题
config.CreateMap<UnitDto, Unit>()
    .ForCtorParam("id", options => options.MapFrom(unit => unit.OwnerId))
    .ForCtorParam("owner", options => options.MapFrom((unitDto, context) =>
    {
        var playerService = context.Options.ServiceCtor(typeof(IPlayerService)) as IPlayerService;

        return playerService.GetPlayer(unitDto.OwnerId);
    }));