晚上好!
我目前正在寻找一种方法来“过滤”对象,然后再将其发送到我的存储库;也就是说,保留原始实例的某些属性,同时忽略或替换具有默认值的其他属性,具体取决于上下文。实际上,我认为这可以替代所有我的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 :(得分: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));
你可能甚至不必让覆盖只使用不同的配置。