有没有办法用AutoMapper进行过滤?

时间:2010-12-15 01:41:05

标签: c# properties mapping filtering automapper

晚上好!

我目前正在寻找一种方法来“过滤”对象,然后再将其发送到我的存储库;也就是说,保留原始实例的某些属性,同时忽略或替换具有默认值的其他属性,具体取决于上下文。实际上,我认为这可以替代所有我的DTO,无需进行类型转换,同时保护我的应用程序免受“过度发布”的影响,如Brad Wilson's blog所述。

换句话说,我要做的就是替换:

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模型绑定机制直接相关的内容,因为我想在Web服务或控制台应用程序中重用它。

谢谢!

1 个答案:

答案 0 :(得分:0)

我不知道你为什么要这样做,但我会说这里最好的方法是有多个子对象可以用来满足你的需要。

e.g。

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));

你可能甚至不必让覆盖只使用不同的配置。