модель представления к связующему объекту - PullRequest
1 голос
/ 23 февраля 2012

У меня есть вопрос, который я не знаю, как его задать. Увидеть; У меня есть такой объект:

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

Есть ли у кого-нибудь идеи, с чего мне начать или где я могу найти ресурсы для изучения этого? Спасибо заранее.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

AutoMapper - Best Way

Посмотри на это. Это идеально подходит для вашей проблемы: 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);
    }
}
0 голосов
/ 23 февраля 2012

Вы можете использовать методы расширения для копирования свойств в другой объект:

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