我应该从服务层或几乎任何方法返回什么

时间:2011-01-23 04:43:17

标签: c# asp.net-mvc

仍然能让我得到的一件事是从方法中返回什么?我知道你应该尽可能具体(即如果你需要返回一个int,不要返回对象)

然而就是这样的情况

我有一个包含业务逻辑的服务层。假设我有一个名为CreateAnEvent()的方法

基本上它会将事件保存到数据库中,如果成功,它将返回一个“保存到数据库”的字符串

如果我首先需要检查此事件是否符合某些业务规则,会发生什么。

  1. 不能低于今天的日期。
  2. 从今天起不能超过一周。
  3. 无法在星期五创建。
  4. 我需要首先做一些可能导致验证错误的业务检查,或者某些其他错误(甚至可能是异常),或者成功消息仍然会让我知道应该返回的内容。

    让我们先进行验证。假设用户现在失败了所有这些验证规则?我正在返回一个字符串,所以这将不会很好我将不得不使用csv返回所有错误并解析出来。

    所以这看起来非常糟糕。

    我首先可以有一个名为Validate()的单独方法,但现在我必须记得在调用CreateAnEvent()之前调用它。所以我认为这不是那么好。

    我在我的mvc项目中使用ViewModel,所以也许我应该将整个viewModel传递给服务层,然后返回此ViewModel。

    在这个视图模型中,我可以有一组错误,我可以将所有这些错误添加到一个字符串中以包含成功消息。

    一旦它返回,如果count为零,则首先检查错误,然后假设成功填充msg。

    我没有返回最具体的类型,但它可以解决我的问题。但是,我不认为服务层应该知道有关viewModel的任何信息。

    我知道有些人在viewmodel中进行验证,但我认为更多的是基本的非业务逻辑规则,比如是否为字段空白。我认为我不应该像上面在viewmodel中描述的那样进行测试。

    所以我能想到的最后一个选项是在域模型中发送(因为我很可能在视图中使用它,所以它将在viewmModel中)并且在这个域模型中我会添加一个字符串成功消息和错误集合。

    然后我会返回此域模型。

    所以它与使用ViewModels基本相同,但这次提取出域模型并使用它。

    这是最好的方法,还是有更好的方法?

1 个答案:

答案 0 :(得分:3)

我更喜欢将验证逻辑分成自己的类。原因是实体可以有各种验证层。我的验证器类实现以下接口:

public interface IValidator<T>
{
    bool IsValid(T entity);
    IEnumerable<string> BrokenRules(T entity);
}

然后我将此验证器注入我的服务中。如果方法成功/失败,则服务可以返回布尔值。在失败时,可以使用'BrokenRules'可枚举中包含的附加信息。我在博文中记录了这一点:

http://blog.bobcravens.com/2010/09/the-repository-pattern-part-2/

如果您有任何疑问,请与我们联系。希望这会有所帮助。

鲍勃