2010-12-15 119 views
0

晚上好!有没有办法用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服务或控制台应用程序中重用该机制。

谢谢!

回答

0

我不知道你为什么想这样做,但我会说这里最好的办法是有多个子对象,可以用于你需要的东西。

例如

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

你可能甚至不需要覆盖只是使用不同的配置。

相关问题