【发布时间】: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