ASP.NET MVC, строго типизированное представление; при редактировании / обновлении элемента я должен сопоставить свойства или прикрепить объект к сеансу? - PullRequest
1 голос
/ 27 июня 2011

Я пытаюсь понять DDD здесь, и я где-то читал, что возможно для повторного использования сущностей домена в качестве моделей представления.Я создал простое приложение CRUD, но в U (pdate) я немного застрял на «?????»:

// snippet of the content of the ItemController:
public ViewResult Edit(Guid id)
{
    Item item = _itemDomainService.GetFromCurrentUser(id);
    return View(item);
}

[HttpPost]
[Transaction]
public ViewResult Edit(Item item)
{
    // Validate here

    //????
    return Redirect("Item", "Details", item.Id);
}

Я использую nhibernate с сеансом для запросашаблон («Транзакция» является пользовательским атрибутом).Но «элемент» не «отслеживается» (это переходный ) для сеанса nhibernate.Каков предпочтительный метод получения изменений в «элементе» в соответствующую строку в базе данных?

Я сам думаю о следующих вариантах:

  • Картавсе свойства для постоянного "элемента", поэтому (в "????"):

    var fromDB = _itemDomainService.GetById(item.Id);
    fromDB.Name = item.Name;
    fromDB.Description = item.Description
    // etc
    
  • Присоединить элемент к сеансу:

     // of course session would be abstracted away, but for brevity pretend it gets injected into the controller
     session.Update(item);
    
  • Мой дизайн совершенно неправильный, и мне нужно (например) не использовать сеанс для запроса ...

Что вы думаете об этом?

Ответы [ 2 ]

3 голосов
/ 27 июня 2011

Обычно считается лучшей формой передавать DTO (объект передачи данных) между контроллером и представлением, а не самими объектами вашего домена.

Затем в действии «Редактировать» в контроллере вы извлекаете объект из своего репозитория с помощью идентификатора, предоставленного DTO, и обновляете свойства, в основном, как вы предлагали выше.

, например

[HttpPost]
[Transaction]
public ViewResult Edit(ItemDTO item)
{
    // Validate here

    var fromDB = _itemDomainService.GetById(item.Id);
    fromDB.Name = item.Name;
    fromDB.Description = item.Description
    return Redirect("Item", "Details", item.Id);
}

Чтобы избежать написания большого количества кода «fromDB.X = item.X», вы должны взглянуть на AutoMapper , который сопоставит свойства для вас, если вы назовете свои свойства DTO в соответствии с некоторыми простыми соглашениями .

1 голос
/ 27 июня 2011

Хм, сложно, потому что я знаю MVC, но не NHibernate.Я действительно знаю Entity Framework, так что я предполагаю, что они достаточно похожи, чтобы все еще быть полезными. Надеюсь:

Я бы сделал что-то вроде:

//get the original item from the DB
var fromDB = _itemDomainService.GetById(item.Id);

//update fromDB with values from the current "Item" that was posted
UpdateModel(fromDB);

//then save the changes that were made
_itemDomainService.SaveChanges();
//this last line is how it is done in Entity Framework - but I guess there is something similar in NHibernate
...