Можно ли «убедить» AutoMapper временно приостановить определенные сопоставления?

Можно ли «убедить» AutoMapper временно приостановить определенные сопоставления?

Чтобы проиллюстрировать, чего я пытаюсь достичь, я буду использовать иллюстрацию.Предположим, что у меня есть репозиторий StudentRepository, который использует LINQ для взаимодействия с объектами базы данных (таблицами), такими как студенты, курсы, мероприятия, клубы и т. д. На стороне приложения есть соответствующие объекты домена Student, Course, деятельность, клуб. Класс 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()
            .ForMember(dest => dest.Courses, opt => opt.MapFrom(src => Mapper.Map>(src.TableCourses)))
            .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => Mapper.Map>(src.TableActivities)))
            .ForMember(dest => dest.Clubs, opt => opt.MapFrom(src => Mapper.Map>(src.TableClubs)))
        // where TableStudents, TableCourses, TableActivities, TableClubs are database entities

        // ... yet more mappings

    }
}

Возможно ли это? «убедить» 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(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 управления, может быть http://codebetter.com/davidhayden/2007/08. /06/linq-to-sql-query-tuning-appears-to-break-down-in-more-advanced-scenarios/, где в случае ассоциации 1:n, только LINQ to SQL поддерживает объединение одной ассоциации 1:n на запрос. AutoMapper будет здесь неэффективным — выполнение N вызовов для загрузки курсов для возвращенных N студентов, еще N вызовов для загрузки действий для тех же N возвращенных студентов и, возможно, еще N вызовов для загрузки клубов для тех же возвращенных N студентов.

9
задан John Gathogo 23 May 2012 в 04:20
поделиться