【问题标题】:view-model to entity binder视图模型到实体绑定器
【发布时间】:2012-02-23 10:48:42
【问题描述】:

我有一个不知道怎么问的问题。看;我有一个这样的实体:

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){ }
}

大家都知道我应该从哪里开始,或者我在哪里可以找到一些资源来学习这个?提前致谢。

【问题讨论】:

    标签: c# generics c#-4.0 reflection model-binding


    【解决方案1】:

    AutoMapper - 最佳方式

    看看这个。它非常适合您的问题: 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);
        }
    }
    

    【讨论】:

    • 感谢指导。但我想学习它,而不仅仅是使用外部库。我下载了它,看看它的源代码,我很难理解它的代码。我正在寻找一个简单的初学者点来学习。你能帮助我吗?或者您知道任何资源或起点吗?
    • 好的,我添加了一个带有反射的简单小例子。但对于未来:我更喜欢 AutoMapper,因为它速度快而且非常安全。 AutoMapper 在 IL-Code 中进行映射 - 我认为 - 所以理解起来并不容易。
    【解决方案2】:

    您可以使用扩展方法将属性复制到另一个对象:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2012-07-31
      • 1970-01-01
      相关资源
      最近更新 更多