由于我只有一个DTO,因此我们在Web API中将DTO用于GET,PUT和POST http方法。
为简单起见,我们有ActivityDO:
public ActivityDTO
{
public int Id;
public string Name;
public string CategoryName;
public DateTime DateCreated;
public DateTime DateModified;
}
挑战在于,当您只有一个DTO来处理多种条件(即post / get / put方法)时,映射如下:
private MapperConfiguration configuration = new MapperConfiguration(cfg => {
cfg.CreateMap<ActivityDTO, Activity>()
.ForMember(dst => dst.UserId, opt => opt.MapFrom(src => HttpContext.Current.User.Identity.GetUserId()))
.ForMember(dst => dst.CategoryId, opt => opt.MapFrom(src => GetCategoryId(HttpContext.Current.User.Identity.GetUserId(), src.CategoryName)))
.ForMember(dst => dst.DateCreated, opt => opt.MapFrom(src => DateTime.UtcNow))
.ForMember(dst => dst.DateModified, opt => opt.MapFrom(src => DateTime.UtcNow));
});
如果要进行更新,我想为 DateCreated 进行 IGNORE 映射,并且如果id <= 0
,我们可以做条件,其余的映射用于DateCreated。
这可能吗?宁愿在GET / POST(添加)VS PUT(更新)之间使用单独的DTO?有什么更好的解决方案来处理DateCreated VS DateModified吗?
感谢您的反馈/意见。
答案 0 :(得分:1)
这是添加条件的方法。 那是您要找的东西吗?
private MapperConfiguration configuration = new MapperConfiguration(cfg => {
cfg.CreateMap<ActivityDTO, Activity>()
.ForMember(dst => dst.UserId, opt => opt.MapFrom(src => HttpContext.Current.User.Identity.GetUserId()))
.ForMember(dst => dst.CategoryId, opt => opt.MapFrom(src => GetCategoryId(HttpContext.Current.User.Identity.GetUserId(), src.CategoryName)))
.ForMember(dst => dst.DateCreated, opt => opt.MapFrom(src => src.Condition(src.DateCreated != null)))
.ForMember(dst => dst.DateModified, opt => opt.MapFrom(src => DateTime.UtcNow));
});
我使用了src.DateCreated != null
,但是您可以使用src.Condition()
指定任何条件,并且只有在满足条件时才会映射变量。
也
您可以使用AutoMapper的PreCondition
var configuration = new MapperConfiguration(cfg => {
cfg.CreateMap<Foo,Bar>()
.ForMember(dest => dest.baz, opt => {
opt.PreCondition(src => (src.baz >= 0));
opt.MapFrom(src => {
});
});
});