在ASP.net MVC中(不一定仅限于MVC,只是一个例子),我们的动作方法总是有类似下面的前提条件:
[HttpPost]
public ActionResult Edit(FooModel viewModel)
{
if (viewModel == null)
{
throw new ArugmentNullException("viewModel");
}
if (viewModel.Foo < 1)
{
throw new InvalidOperationException();
}
// Perform real tasks on viewModel (e.g. map it to model, persist to database)
}
现在我知道我们可以将检查重构为存储库类中的静态方法:
[HttpPost]
public ActionResult Edit(FooModel viewModel)
{
if (FooModelRepostory.IsValid(viewModel)
{
}
// Perform real tasks
}
在FooModelRepository.cs
:
public static bool IsValid(FooModel viewModel)
{
if (viewModel == null)
{
throw new ArgumentNullException("viewModel");
}
if (viewModel.Foo < 1)
{
throw new InvalidOperationException();
}
// ...many more checks and throw exceptions accordingly
// if we reach up to here, we are good, return true
return true;
}
我的问题是,我们是否有更好的方法来重构代码而不会使用这样的支票来混淆存储库?
答案 0 :(得分:0)
我没有看到任何更明确的事情已经提供给你。 Code Contracts,是的,允许您向程序添加声明性行为,但也隐藏了明确的逻辑。所以,无论如何,它有两个方面:好的和坏的。
我个人会选择你选择的解决方案,所以采用简单的控制方法。 我唯一想引起你注意的是:
public static bool IsValid(FooModel viewModel)
{
...
}
转发bool
,因此如果出现失败/否定回复,我希望返回false
/ true
值而不会引发异常。这是程序的控制流程,因此简单的return true
或return false
就足够了,并且期望来自您方法的使用者。
答案 1 :(得分:0)
另一种选择是创建验证类。您只需将这些类的对象添加到列表中,并询问列表是否每个验证都有效。只是一些优点:
更多信息和示例: enter link description here