【问题标题】:Is there a way to do filtering with AutoMapper?有没有办法用 AutoMapper 进行过滤?
【发布时间】:2011-07-30 00:01:42
【问题描述】:

晚上好!

我目前正在寻找一种在将对象发送到我的存储库之前“过滤”它的方法;也就是说,根据上下文,保留原始实例的某些属性,同时忽略或用默认值替换其他属性。事实上,我相信这可以替代我所有不需要类型转换的 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 服务或控制台应用程序中重用它。

谢谢!

【问题讨论】:

    标签: c# properties mapping filtering automapper


    【解决方案1】:

    我不知道您为什么要这样做,但我想说这里最好的方法是拥有多个可用于您需要的子对象。

    例如

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

    您可能甚至不必使用不同的配置进行覆盖。

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2019-12-24
      • 2021-11-09
      • 2010-09-08
      • 1970-01-01
      相关资源
      最近更新 更多