阅读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);
}
哪些优点/缺点?有没有我看不到的东西?你用什么 ?什么是标准方法?
在文章中我引用他们使用不同的验证方法,不需要任何'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
@drasto,是的,这也是一个有效和好的方法。唯一的问题是下面一行:_productService = new ProductService(...)在控制器内部,这是非常糟糕的,因为它们将控制器与特定的服务实现紧密耦合在一起。服务应该由DI框架注入,但是问题在于传递'ModelState',因为它会创建循环依赖。在StackOverflow上有一些关于解决这个问题的线程。 – 2011-03-26 11:04:11
你可以请编辑你的答案,以便它是一致的吗?此外,您对他们的方法的看法 - 将包装的参考传递给模型状态到服务构造函数 - 对我来说会很有趣。它似乎会使注入该包装服务很少complicated ... – drasto 2011-03-26 11:06:38