视图模型到实体绑定
本文关键字:绑定 实体 模型 视图 | 更新日期: 2023-09-27 18:25:44
我有一个问题不知道该怎么问。请参阅;我有一个这样的实体:
public class Person{
public int Id {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
}
并且还具有与实体具有相同属性的视图模型:
public class PersonModel{
public int Id {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
}
我的问题是:如何创建一个自动转换器来读取其中一个的属性,并创建一个新的另一个并从第一个写入属性?参见:
// DAL
public class Repository{
public void Save(Person person){
// saving a person entity
}
}
// BLL
public class Service{
public void CreatePerson(PersonModel model){
var person = new Person{
Id = model.Id,
FirstName = model.FirstName,
LastName = model.LastName
};
new Repository().Save(person);
}
}
当我想将所有视图模型从服务传递到存储库时,我必须重复这段代码,以便将它们转换为实体。我知道explicit
和implicit
,我不想使用它们。我的意思是,我正在寻找一种通过反射和泛型自动绑定它们的方法。例如:
public class Binder{
public TOut Bind<TIn, TOut>(TIn inObject){ }
}
每个人都知道我应该从哪里开始,或者在哪里可以找到一些学习资源吗?提前感谢。
自动映射器-最佳方式
看看这个。它非常适合您的问题:AutoMapper
示例:
public User Create(User obj) {
var rep = UnitOfWork.Create<User>();
var usr = Mapper.Map(obj, rep.Create());
rep.Add(usr);
return usr;
}
如果你想在映射时忽略一些属性:
Mapper.CreateMap<User, User>()
.ForMember(dest => dest.ID, opt => opt.Ignore()) // Dont map the ID.
反射-慢速
如果你想使用反射,那么这里有一个例子。但要记录在案。这只是如何工作的一个小样本。如果它是泛型类型、数组或其他类型,则不起作用!
var modelProperties = this.GetType().GetProperties();
foreach(var prop in usr.GetType().GetProperties()) {
var thisProp = modelProperties.FirstOrDefault(n => n.Name == prop.Name);
if(thisProp != null) {
var value = prop.GetValue(usr, null);
thisProp.SetValue(this, value, null);
}
}
您可以使用扩展方法将属性复制到另一个对象:
public static class ConvertPersonToPersonModel
{
public static PersonModel ConvertToPersonModel(this Person person)
{
PersonModel p= new PersonModel(); //assign the properties
p.Id = person.Id;
p.FirstName = person.FirstName;
return p;
}
public static IEnumerable<PersonModel> ConvertPeopleToPeopleModels(this List<Person> people)
{
List<PersonModel> ps= new List<PersonModel>();
foreach (var person in people)
{
ps.Add(ConvertToPersonModel(person));
}
return ps.AsEnumerable<PersonModel>();
}
}
ConvertPersonToPersonModel()方法现在将显示在您的Person对象上,例如
Person p = new Person
p.ConvertToPersonModel();