Есть ли способ сделать фильтрацию с AutoMapper? - PullRequest
0 голосов
/ 15 декабря 2010

Добрый вечер!

В настоящее время я ищу способ "отфильтровать" объект перед отправкой его в мой репозиторий;то есть, сохраняя некоторые свойства из исходного экземпляра, игнорируя или заменяя другие значениями по умолчанию, в зависимости от контекста.На самом деле, я считаю, что это может быть способом заменить все мои DTO, где преобразование типов не требуется, при этом защищая мое приложение от «чрезмерной публикации», как описано в блоге Брэда Уилсона .

Другими словами, я пытаюсь заменить:

public class UserRegistrationModel {
    public string FirstName { get; set; }
    public string Gender { get; set; }
    public string LastName { get; set; }
}

public class UserGenderEditModel {
    public string Gender { get; set; }
}

public class User {
    public string FirstName { get; set; }
    public string Gender { get; set; }
    public bool IsVIP { get; set; }
    public string LastName { get; set; }
}

class Program {
    static void Main(string[] args) {
        Mapper.CreateMap<UserRegistrationModel, User>()
            .ForMember(d => d.FirstName, o => o.MapFrom(s => s.FirstName))
            .ForMember(d => d.Gender, o => o.MapFrom(s => s.Gender))
            .ForMember(d => d.IsVIP, o => o.UseValue(false))
            .ForMember(d => d.LastName, o => o.MapFrom(s => s.LastName));

        Mapper.CreateMap<UserGenderEditModel, User>()
            .ForMember(d => d.FirstName, o => o.Ignore())
            .ForMember(d => d.Gender, o => o.MapFrom(s => s.Gender))
            .ForMember(d => d.IsVIP, o => o.Ignore())
            .ForMember(d => d.LastName, o => o.Ignore());

        var user = Mapper.Map<UserRegistrationModel, User>(new UserRegistrationModel {
            // filling properties
        });
    }
}

чем-то вроде этого (не работает, конечно!):

public class User {
    public string FirstName { get; set; }
    public string Gender { get; set; }
    public bool IsVIP { get; set; }
    public string LastName { get; set; }
}

class Program {
    static void Main(string[] args) {
        Mapper.CreateMap<User, User>()
            .ForMember(d => d.FirstName, o => o.MapFrom(s => s.FirstName))
            .ForMember(d => d.Gender, o => o.MapFrom(s => s.Gender))
            .ForMember(d => d.IsVIP, o => o.UseValue(false))
            .ForMember(d => d.LastName, o => o.MapFrom(s => s.LastName))
            .ForContext("UserRegistration"); // not real.

        Mapper.CreateMap<User, User>()
            .ForMember(d => d.FirstName, o => o.Ignore())
            .ForMember(d => d.Gender, o => o.MapFrom(s => s.Gender))
            .ForMember(d => d.IsVIP, o => o.Ignore())
            .ForMember(d => d.LastName, o => o.Ignore());
            .ForContext("UserGenderEdition"); // not real.

        var user = Mapper.Map<User, User>(new User {
            // filling properties
        }, "UserRegistration"); // not real.
    }
}

Итак, есть лиспособ достижения этой работы (не обязательно с AutoMapper)?

Тем не менее, я не ищу что-то непосредственно связанное с механизмом привязки модели MVC , так как я хотел бы использовать это ввеб-сервис или консольное приложение, например.

Спасибо!

1 Ответ

0 голосов
/ 29 июля 2011

Я не знаю, почему вы хотите это сделать, но я бы сказал, что лучший подход здесь - это иметь несколько подобъектов, которые можно использовать для того, что вам нужно.

например.

public class User
{

    public virtual string Name
    {
        get;
        set;
    }

    public virtual string Gender
    {
        get;
        set;
    }
}

public class UserGender : User
{
    public override string Name
    {
        get
        {
            return string.Empty;
        }
        set
        {
        }
    }
}

Mapper.CreateMap<User, UserGender>()
        .ForMember(d => d.FirstName, o => o.Ignore())
        .ForMember(d => d.Gender, o => o.MapFrom(s => s.Gender));

Возможно, вам даже не нужно иметь переопределения, просто используйте разные конфиги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...