2011-03-26 60 views
0

阅读this关于验证服务层的文章我有一些疑问。ASP.NET MVC:使用相同的服务验证和处理模型

第一:如文章所示将整个模型视图传递给服务是否正确?我见过一些例子而不是通过所使用的控制器整个模型(如bool success = _productService.CreateProduct(productModel))他们称这样的服务:

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

什么是这两种方法的优点/缺点?

第二:我可以看到使用相同的服务验证模型和做实际工作的逻辑。另一方面,这意味着该服务将不得不处理2个问题:数据验证和数据处理。这意味着更多的代码在同一服务和更差的可测试性,对吧?

所以不是示例代码上面会是更好的有:

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

哪些优点/缺点?有没有我看不到的东西?你用什么 ?什么是标准方法?

回答

1

我更愿意将整个模型传递给服务而不是单个属性以避免混淆方法。就验证逻辑而言,你说它必须处理两个问题:业务逻辑验证和实际存储。我认为这两个问题属于服务。此服务的使用者不应只能在未经验证的情况下仅调用保存,并在服务中执行这两件事情可确保不会发生这种情况。此外,实际的保存可以由服务方法委托给一个或多个CRUD存储库调用。

所以控制器:

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

在已链接下面的方法来初始化服务,并通过它的模型状态中的物品,以便它直接写入错误:

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

这样以后你可以直接:

_productService.CreateProduct(productModel); 

这也是一个有效的和好的方法。唯一的问题是控制器内部的以下行_productService = new ProductService(...非常糟糕,因为它将控制器与特定的服务实现紧密耦合。该服务应该由DI框架注入,但问题在于传递ModelState,因为它会产生循环依赖。这里有some threads解决这个问题。

+0

在文章中我引用他们使用不同的验证方法,不需要任何'out'参数...'ProductService'的构造函数就像'public ProductService(IProductRepository prodRepo,IModelValidation modelValidat)'然后在控制器中初始化'_productService'就像'_productService = new ProductService(_productRepository,new ModelStateValidationWrapper(this.ModelState))'。然后在action方法中,他们只调用'_productService.CreateProduct(productModel)',模型状态由服务自动更新。 – drasto 2011-03-26 10:58:18

+1

@drasto,是的,这也是一个有效和好的方法。唯一的问题是下面一行:_productService = new ProductService(...)在控制器内部,这是非常糟糕的,因为它们将控制器与特定的服务实现紧密耦合在一起。服务应该由DI框架注入,但是问题在于传递'ModelState',因为它会创建循环依赖。在StackOverflow上有一些关于解决这个问题的线程。 – 2011-03-26 11:04:11

+0

你可以请编辑你的答案,以便它是一致的吗?此外,您对他们的方法的看法 - 将包装的参考传递给模型状态到服务构造函数 - 对我来说会很有趣。它似乎会使注入该包装服务很少complicated ... – drasto 2011-03-26 11:06:38