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