Конструкторы и методы на классах POCO с шаблоном IRepository

Можно ли иметь конструктор или другие методы, не связанные с базой данных, для классов POCO. Например, при передаче модели представления в контроллер.

контроллер:

public ActionResult SomeMethod(SomeViewModel model) 
{
    var entity = new SomePocoClasse(model);
    // ... then save entity to database

    return SomeActionResult
}

Сущность:

public SomeClass() {}

public SomeClass(SomeViewModel model) 
{
    // create itself based on values in model
}

public void Update(SomeViewModel model)
{
    // Update itself base on values in model
}

Первый конструктор сущностей предназначен для структуры сущностей или регулярного создания

var entity = new entity 
{
    // set up properties
};

Второй для создания из SomeViewModel

var entity = new entity(SomeViewModel);

Метод для обновления самого себя от SomeViewModel

var entity = SomeIRepository.Get(id);
entity.Update(SomeViewModel);

Или вышеупомянутая плохая практика, которая должна пойти куда-то еще.

1 ответ

Решение

И да и нет. В общем, не обязательно плохая практика иметь конструктор в POCO. Есть множество причин, по которым вы могли бы хотеть или нуждаться в этом. Тем не менее, вы должны убедиться, что вы также поддерживаете конструктор без параметров, иначе вы вызовете проблемы с такими вещами, как EF, которые не будут знать, как правильно инициализировать ваш класс POCO в противном случае.

Тем не менее, то, что вы делаете здесь, не является хорошей практикой. Вы не предоставили тонны кода, но похоже, что вы передаете модель представления конструктору POCO для установки свойств в POCO с этими значениями. Скорее, то, что вы должны сделать, это извлечь сущность из базы данных и затем сопоставить любые соответствующие свойства вашей модели представления с этим экземпляром сущности. Я предположил, что то, что вы делаете, может быть хорошо только при создании новой сущности, но это означает, что есть два отдельных способа заполнения вашего класса POCO значениями в зависимости от того, создаете вы или редактируете. Это увеличивает сложность и сложность означает более высокие затраты на техническое обслуживание.

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

public static class SomePocoMapper
{
    public static SomePoco Map(SomeViewModel model)
    {
        return Map(model, null);
    }

    public static SomePoco Map(SomeViewModel model, SomePoco entity)
    {
        entity = entity ?? new SomePoco();
        // map over property values;
        return entity;
    }
}

Затем в вашем действии создания:

var entity = SomePocoMapper.Map(model);

И в вашем действии редактирования:

var entity = // get entity from database
SomePocoMapper.Map(model, entity);
Другие вопросы по тегам