视图模型到实体绑定

本文关键字:绑定 实体 模型 视图 | 更新日期: 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);
    }
}

当我想将所有视图模型从服务传递到存储库时,我必须重复这段代码,以便将它们转换为实体。我知道explicitimplicit,我不想使用它们。我的意思是,我正在寻找一种通过反射和泛型自动绑定它们的方法。例如:

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