如何忽略有条件的映射
How to ignore mapping with condition
因为我只有一个 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 的映射如果我们进行更新并且我们可以做条件如果id <= 0
, 其余允许映射到 DateCreated.
这可能吗?宁愿在 GET/POST(添加)VS PUT(更新)之间有一个单独的 DTO?有没有更好的解决方案来处理这个 DateCreated VS DateModified 事情?
我很感激你 feedback/comment。
这是添加条件的方法。
这就是您要找的吗?
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 => {
});
});
});
因为我只有一个 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 的映射如果我们进行更新并且我们可以做条件如果id <= 0
, 其余允许映射到 DateCreated.
这可能吗?宁愿在 GET/POST(添加)VS PUT(更新)之间有一个单独的 DTO?有没有更好的解决方案来处理这个 DateCreated VS DateModified 事情?
我很感激你 feedback/comment。
这是添加条件的方法。 这就是您要找的吗?
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 => {
});
});
});