簡體   English   中英

如何通過使用valueInjecter而不是AutoMapper進行這些映射

[英]How to do these mappings by using valueInjecter instead of AutoMapper

我以前在一個項目中使用過Automapper,現在我想在另一個項目中使用ValueInjecter。

這些是ViewModel

public class ApplicantListViewModel : BaseViewModel
{
    public int Id {get; set;}
    public string Name {get;set;}
    public string CourseName {get;set;}

}

public class CourseListViewModel : BaseViewModel
{
    public int Id {get; set;}
    public string Name {get;set;}
    public int Applicants {get;set;}
}

這些是我的DTO

public class Course : BaseEntity
{
    public string Name { get; set; }

    public virtual IList<Applicant> Applicants { get; set; }
}

public class Applicant : BaseEntity
{
    public string Name { get; set; }

    public int CourseId { get; set; }
    public virtual Course Course { get; set; }

}

我可以使用Automapper將DTO映射到ViewModels,如下所示

 AutoMapper.Mapper.CreateMap<Applicant, ApplicantListViewModel>();

 AutoMapper.Mapper.CreateMap<Course, CourseListViewModel>()
                .ForMember(s => s.Applicants, d => d.MapFrom(s => s.Applicants.Count));

然后,它將自動將課程映射到CourseListViewModel,並將申請人映射到ApplicantListViewModel。 當它映射時,我可以看到ApplicantListViewModel的CourseName屬性通過使用AutoMapper從Course.Name獲取其值,而無需任何特殊配置,但ValueInjector不會映射它(CourseName變為null)。 CourseListViewModel的Applicants屬性也可以通過很少的配置從Applicants.Count獲取其值。

如何更輕松地通過ValueInjecter進行這些映射?

看看壓扁unflattening

這是您的代碼示例:

    [Test]
    public void Mapper()
    {
        var course = new Course { Name = "just a simple name" };
        var applicantList = new List<Applicant>()
            {
                new Applicant {Course = course, CourseId = 1, Name = "Applicant Course 1"}, 
                new Applicant {Course = course, CourseId = 2, Name = "Applicant Course 2"}
            };
        course.Applicants = applicantList;

        var courseView = new CourseListViewModel();
        courseView.InjectFrom<FlatLoopValueInjection>(course);
        //just set other props here, like you did with AutoMapper.
        courseView.Applicants = course.Applicants.Count;

        var applicantViewList = applicantList.Select(s =>
            {
                var applicantView = new ApplicantListViewModel();
                applicantView.InjectFrom<FlatLoopValueInjection>(s);
                return applicantView;
            }).ToList();

        Assert.AreEqual(course.Name, courseView.Name);
        Assert.AreEqual(course.Applicants.Count, courseView.Applicants);

        Assert.AreEqual(applicantList[0].Name, applicantViewList[0].Name);
        Assert.AreEqual(applicantList[0].Course.Name, applicantViewList[0].CourseName);
    }

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM