特定のマッピングを一時的に停止するように AutoMapper を「説得」できますか?
何を達成しようとしているのかを説明するために、イラストを使用します。LINQ を使用して、Students、Courses、Activities、Clubs などのデータベース オブジェクト (テーブル) とやり取りするリポジトリStudentRepositoryがあるとします。アプリケーション側には、一致するドメイン オブジェクト Student、Course、Activity、Club があります。Student クラスには、次のような Course、Activity、および Club 型の配列メンバーが含まれています。
public class Student
{
// ... more members
public Course[] Courses { get; set; }
public Activity[] Activities { get; set; }
public Club[] Clubs { get; set; }
// ... even more members
}
AutoMapper は、次のように StudentRepository の静的コンストラクターでマッピングが定義されているドメイン オブジェクトにデータベース オブジェクトをマップするように構成されています。
public class StudentRepository : IStudentRepository
{
static class StudentRepository
{
// ... other mappings
Mapper.CreateMap<TableStudent, Student>()
.ForMember(dest => dest.Courses, opt => opt.MapFrom(src => Mapper.Map<IEnumerable<Course>>(src.TableCourses)))
.ForMember(dest => dest.Activities, opt => opt.MapFrom(src => Mapper.Map<IEnumerable<Activity>>(src.TableActivities)))
.ForMember(dest => dest.Clubs, opt => opt.MapFrom(src => Mapper.Map<IEnumerable<Clubs>>(src.TableClubs)))
// where TableStudents, TableCourses, TableActivities, TableClubs are database entities
// ... yet more mappings
}
}
1 つの関数ブロック内でマッピングを一時停止するように AutoMapper を「説得」することは可能ですか? 例えば:
public Student[] GetStudents()
{
DataContext dbContext = new StudentDBContext();
var query = dbContext.Students;
// => SUSPEND CONFIGURATION MAPPINGS for Subjects, Activities and Clubs WHILE STILL making use of others
// => The idea here it to take personal charge of 'manually' setting the particular members (*for some specific reasons)
var students = Mapper.Map<Student>(query); // => Still be able to use AutoMapper to map other members
}
public Student[] OtherStudentRepositoryMethods()
{
// Other repository methods continue to make use of the mappings configured in the static constructor
}
注「特定の理由で」: AutoMapperから制御を奪いたい理由の 1 つは、これです。to-break-down-in-more-advanced-scenarios/ 1:n アソシエーションの場合、LINQ to SQL はクエリごとに 1 つの 1:n アソシエーションの参加のみをサポートします。AutoMapper はここでは非効率的です。返された N 人の学生の Courses を読み込むために N 回の呼び出しを行い、同じ N 人の学生のために Activity を読み込むためにさらに N 回の呼び出しを行い、返された同じ N 人の学生のために Clubs を読み込むためにさらに N 回の呼び出しを行う可能性があります。