如何在automapper类中编写方法c#

时间:2017-07-13 19:29:50

标签: c# automapper

我正在尝试在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类中自己包含这段代码。

由于

2 个答案:

答案 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是从其他地方的业务逻辑生成的变量那么它是一个问题!

无论如何,让我知道它是否有帮助以及该变量的来源!