ASP.NET MVC: проверка и обработка модели с использованием одного и того же сервиса - PullRequest
0 голосов
/ 26 марта 2011

После прочтения этой статьи о проверке с помощью сервисного уровня у меня есть некоторые сомнения.

Во-первых: все ли правильно, чтобы передать весь вид модели в сервис, как показано в статье? Я видел некоторый пример, в котором вместо передачи всей модели, используемой контроллером (например, bool success = _productService.CreateProduct(productModel)), они называли службы следующим образом:

 bool success = _productService.CreateProduct(productModel.Name, productModel.Category, productModel.Cost)

Каковы плюсы / минусы обоих подходов?

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

Так что вместо приведенного выше примера кода было бы лучше иметь:

bool valid = _productValidationService(productModel);
if(valid){
    _productService.CreateProduct(productModel);
    //or maybe _productService.CreateProduct(productModel.Name, productModel.Category, productModel.Cost);
}

Какие плюсы / минусы? Есть что-то, чего я не вижу? Что ты используешь ? Что такое стандартный подход?

1 Ответ

1 голос
/ 26 марта 2011

Я предпочитаю передавать всю модель службе, а не отдельным свойствам, чтобы не загромождать методы.Что касается логики проверки, вы говорите, что она имеет дело с двумя проблемами: проверка бизнес-логики и фактическое сохранение.Я думаю, что эти две проблемы принадлежат службе.Потребитель этой услуги не должен иметь возможность вызывать только сохранение без предварительной проверки, а выполнение этих двух вещей в службе гарантирует, что этого не произойдет.Также фактическое сохранение может быть делегировано методом сервиса одному или нескольким вызовам хранилища CRUD.

Итак, в контроллере:

string error;
if (!_productService.TryCreateProduct(productModel, out error))
{
    ModelState.AddModelError("key", error);
    return View(viewModel);
}

В статье, которую вы связали, используется следующий подход для инициализации службы и передачи ей состояния модели, чтобы она напрямую записывала ошибки:1006 *

_productService = new ProductService(
    _productRepository, 
    new ModelStateValidationWrapper(this.ModelState)
);

, чтобы позже вы могли напрямую:

_productService.CreateProduct(productModel);

Это также правильный и хороший подход.Единственная проблема - следующая строка _productService = new ProductService(... внутри контроллера, что очень плохо, поскольку оно тесно связывает контроллер с конкретной реализацией службы.Служба должна быть внедрена структурой DI, но проблема заключается в передаче ModelState, поскольку это создаст циклическую зависимость. некоторые темы здесь решают эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...