ПОЧТА ViewModel и проверки на DomainModel - PullRequest
4 голосов
/ 01 сентября 2011

Я занимаюсь разработкой веб-приложения, используя asp.net mvc и nhibernate. Я пытаюсь следовать некоторым принципам DDD и лучшим правилам Asp.Net MVC. Мой вопрос касается очистки POST с помощью VIewModels. Чтобы проиллюстрировать мой вопрос, посмотрите эту сущность на моей модели домена:

[Validator(typeof(EntityValidator))]
public class MyEntity {
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Email { get; set; }
    public virtual decimal UnitPrice { get; set; }
    public virtual Category Category { get; set; }

    public MyEntity() { }
}

Он сопоставлен с nhibernate и работает нормально. Для проверки я использую Fluent Validation, и у меня есть этот класс:

public class EntityValidator : AbstractValidator<MyEntity>
{   
    protected IEntityRepository EntityRepository { get; set; }
    public EntityValidator(IEntityRepository entityRepository) { // injected by a IoC Container
        this.EntityRepository = entityRepository;

        RuleFor(x => x.Name).NotEmpty();
        RuleFor(x => x.UnitPrice).GreaterThan(0);
        RuleFor(x => x.Category).NotNull();
        RuleFor(x => x.Email).NotEmpty().EmailAddress().Must((entity, email) => EntityRepository.ExisteEmail(entity.Email));
    }
}

Я предпочитаю использовать Fluid Validation, чем аннотации данных, потому что он более гибкий и отлично работает с Asp.Net MVC. Он настроен и работает нормально. Итак, у меня есть эта ViewModel:

public class EntityViewModel {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public decimal UnitPrice { get; set; }
    public int IdCategory { get; set; }
}

Теперь я пытаюсь сделать ViewModel для очистки POST моей сущности в некоторых действиях (например, INSERT, UPDATE), потому что я использую nhibernate. Я

не знаю, правильно ли создавать валидацию для viewmodel, потому что у меня есть своя собственная сущность, так как я могу это сделать? Как у вас дела

ПОСТАВИТЬ вашу сущность в действиях, чтобы сохранить его? Как вы проверяете это и публикуете ошибки на ModelState из MVC?

Я хотел бы увидеть код, как это сделать, если это возможно.

Спасибо всем!

1 Ответ

11 голосов
/ 01 сентября 2011

не знаю, правильно ли создавать валидацию для viewmodel, потому что у меня есть своя собственная сущность, так как я могу это сделать?

Лично я определяю свободныйвалидаторы для моих моделей зрения.Они содержат правила проверки для простых вещей, таких как требуемые свойства, форматы и т. Д., Чтобы эти проверки могли обрабатываться непосредственно в представлении.

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

[HttpPost]
public ActionResult Insert(UpdateViewModel viewModel)
{
    if (!ModelState.IsValid)
    {
        // the surface validation on our view model failed => redisplay the view so
        // that the user can fix errors
        return View(viewModel);
    }

    // at this stage the view model is valid => we can map it back to a domain model
    // I use AutoMapper for this:
    var domainModel = Mapper.Map<UpdateViewModel, DomainViewModel>(viewModel);

    // then we pass the domain model to the service layer for processing:
    string error;
    if (!_service.Insert(domainModel, out error))
    {
        // something wrong happened on the service layer
        ModelState.AddModelError("key", error);
        return View(viewModel);
    }

    // everything went fine
    return RedirectToAction("Success");
}

Как вы можете видеть из этого примера, мы делегируем обработку уровню обслуживания.Способ реализации этого сервиса не представляет интереса или смысла для приложения ASP.NET MVC.Вы можете использовать NHibernate, Entitiy Framework, вызывать некоторые другие сервисы на все, что только можете придумать, все, что нас должно волновать, - это то, что мы обрабатываем нашу модель домена, готовую к обработке, и она сообщает нам об ошибках, если таковые имеются.То, как вы обрабатываете свою проверку на сервисном уровне, также не имеет значения для приложения ASP.NET MVC => вы могли бы использовать Castle Validator, Fluent Validation, аннотации данных, что угодно ...

Насколькочто касается сопоставления, то может быть дополнительный шаг, если, например, вы обновляете существующую сущность домена.В этом случае модель представления, вероятно, не содержит все свойства модели предметной области, потому что в этом конкретном представлении, например, мы разрешаем редактировать только некоторые свойства.В этом случае поток будет выглядеть так:

// Fetch the original domain model we want to update
var domainModel = _service.Get(viewModel.Id);

// Update only the properties that are present on the view:
Mapper.Map<UpdateViewModel, DomainViewModel>(viewModel, domainModel);

// Pass to the service layer for processing:
string error;
if (!_service.Update(domainModel, out error))
{
    ...
}
...