6

AutoMapper の GitHub でこの例を読みましたが、この例では、InnerSourceをマップする方法が 1 つしかないと想定しています。

Mapper.CreateMap<OuterSource, OuterDest>();
Mapper.CreateMap<InnerSource, InnerDest>();
Mapper.AssertConfigurationIsValid();

var source = new OuterSource
    {
        Value = 5,
        Inner = new InnerSource {OtherValue = 15}
    };

var dest = Mapper.Map<OuterSource, OuterDest>(source);

私のプロジェクトでは、循環参照を持つ EF で作成されたオブジェクトをシリアル化しています。その理由は、さまざまな「方向」からオブジェクトに到達する必要があるからです。たとえば、ユーザーのリストを要求する場合、ユーザーが関連付けられているプロジェクトを確認したいと考えています。プロジェクトを依頼すると、そのプロジェクトに関連付けられているユーザーが表示されます。

User.Role.Project.TaskTime.Userこれらの循環参照は、User.TaskTime.Project.Task.TaskType.VisibleToRole.Role.User、 などのようにかなり深くなる可能性があります。

したがって、ネストされたマッピングをかなり深くする必要があり、その方法は最初のマッピングが何であったかによって異なります。

現在、私はやっています:

Mapper.CreateMap<User, UserFull>()
    .ForMember("TaskTimes", opt => opt.MapFrom(src => Mapper.Map<ICollection<TaskTime>, UserTaskTime>(src.TaskTimes)));
Mapper.CreateMap<TaskTime, UserTaskTime>()
    .ForMember("Task", opt => opt.MapFrom(src => Mapper.Map<Task, UserTaskTimeTask>(src.Task)));
//...

そのスニペットのビューモデルは次のようになります。

public class UserFull
{
    public string Email { get; set; }
    public string Name { get; set; }

    public virtual ICollection<TaskTime> TaskTimes { get; set; }
    //...
}

public class UserTaskTime
{
    public int Id { get; set; }
    public Task Task { get; set; }
    //...
}

public class UserTaskTimeTask
{
    //...
}

これは正しいですか?ビューモデルから各メンバーを投影し、投影を使用して手動でマッピングする必要がありますか? または、これを行うためのよりクリーンな方法はありますか?

4

0 に答える 0