解析 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);
}));
我有一个没有 属性 设置器但有参数化构造函数的实体:
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);
}));