我正在尝试在AutoMapper类中编写方法。我的情况如下。
ClinicListVm = AutoMapperConfig.mapper
.Map<GetClinicsByUserName_Result, ClinicListViewModel>(c);
我已经使用GetClinicsByUserName_Result映射了ClinicListViewModel,现在我想操作我的目标模型的一个属性,如下所示。
ClinicListVm.ProgressBarCssClass = string.Empty;
if (ClinicListVm.PercentComplete == 100)
{
ClinicListVm.ProgressBarCssClass = "progress-bar-success";
}
else if (DateTime.Now.Subtract(ClinicListVm.BillerStartDateTime ?? DateTime.Now).TotalDays > MaxDaysInDataEntry)
{
// partial is a warning color
ClinicListVm.ProgressBarCssClass = "progress-bar-partial";
}
那么,我如何在automapper类中自己包含这段代码。
由于
答案 0 :(得分:1)
我个人认为@Rajmond Burgaj的anwer很好。在这种情况下,使用ResolveUsing()或自定义解析器是一种很好的方法。
但是,我只是希望分享一个更实用的替代方案,可能会导致相同,可能将来会帮助您。您可能需要考虑将条件if ... then ...逻辑抽象为单独的函数。例如:
UIViewController
通过这种方式,您可以轻松地将其映射到您的配置中,如下所示:
pod 'GooglePlaces'
这完全按照您的预期运行。这是完整的样本,作为XUnit测试(但你会得到图片):
private string DetermineProgressBarState(SourceClass source)
{
if (source.PercentComplete == 100) return "progress-bar-success";
var MaxDaysInDataEntry = 42; // missing in your sample
return DateTime.Now.Subtract(source.BillerStartDateTime ?? DateTime.Now).TotalDays > MaxDaysInDataEntry
? "progress-bar-partial"
: null;
}
但是...... 我完全同意 AutoMapper不适合放置此逻辑的评论。原因是您实际上在映射逻辑中定义了标记逻辑(html / css数据)。这可以更好地放在你的视图中,大概是你的.cshtml。
考虑到这一点,如果您选择以某种方式重构“未来的正确方法”,Mapper.Initialize((config =>
{
config.CreateMap<SourceClass, TargetClass>()
.ForMember(
dest => dest.ProgressBarCssClass,
opt => opt.MapFrom(src => DetermineProgressBarState(src))
);
}));
功能仍然会有所帮助。您只需将代码从AutoMapper配置移动到控制器(或.cshtml帮助程序)。
答案 1 :(得分:0)
如果你想在映射时执行另一个函数,可以使用ResolveUsing
方法并将逻辑放在那里。
CreateMap<GetClinicsByUserName_Result, ClinicListViewModel>()
.ForMember(d => d.ProgressBarCssClass , o => o.ResolveUsing(s =>
{
//Do your custom logic here.
}))
.AfterMap((src, dest) =>
{
//Do your logical after mapping has been done
dest.ProgressBarCssClass = string.Empty;
if (dest.PercentComplete == 100)
{
dest.ProgressBarCssClass = "progress-bar-success";
}
else if (DateTime.Now.Subtract(dest.BillerStartDateTime ??
DateTime.Now).TotalDays > MaxDaysInDataEntry)
{
// partial is a warning color
dest.ProgressBarCssClass = "progress-bar-partial";
}
});
不完全确定MaxDaysInDataEntry
来自何处,但是如果可以在此方法中检索它,那么这样做是好的,否则如果MaxDaysInDataEntry
是从其他地方的业务逻辑生成的变量那么它是一个问题!
无论如何,让我知道它是否有帮助以及该变量的来源!