仍然可以得到我的一件事是从方法中返回什么?我知道你应该尽可能具体(即如果你需要返回一个int,不要返回对象)
不过就是这样的情况
我有一个包含业务逻辑的服务层.假设我有一个名为CreateAnEvent()的方法
基本上它将事件保存到数据库,如果成功,它将返回一个"保存到数据库"的字符串
现在,如果我首先需要检查此事件是否符合某些业务规则,会发生什么.
像我需要首先做一些业务检查,可能导致验证错误或可能是某种其他错误(甚至可能是异常)或成功消息仍然得到我应该返回的东西.
所以我们首先进行验证.假设用户现在失败了所有这些验证规则?我返回一个字符串,所以这将不会很好我将不得不使用csv返回所有错误并解析出来.
所以这看起来非常糟糕.
我可以先使用一个名为Validate()的单独方法,但现在我必须记得在调用CreateAnEvent()之前调用它.所以我认为这不是那么好.
我在我的mvc项目中使用ViewModel所以也许我应该将整个viewModel传递给服务层然后返回此ViewModel.
在这个视图模型中,我可以有一组错误,我可以将所有这些错误添加到一个字符串中以包含成功消息.
一旦它返回,如果count为零,则首先检查错误,然后假设成功填充msg.
我没有返回最具体的类型,但它可以解决我的问题.但是,我不认为服务层应该知道有关viewModel的任何信息.
我知道有些人在viewmodel中进行验证,但我认为更多的是基本的非业务逻辑规则,比如是否为字段空白.我认为我不应该像在视图模型中描述的那样进行测试.
所以我能想到的最后一个选项是发送域模型(因为我很有可能在视图中使用它,所以它将在viewmModel中),并且在这个域模型中我会为成功消息添加一个字符串错误的集合.
然后我会返回这个域模型.
所以它与使用ViewModel基本相同,但这次提取出域模型并使用它.
那么这是最好的方式还是有更好的方法?
我更喜欢将验证逻辑分成自己的类。原因是实体可以有不同的验证层。我的验证器类实现以下接口:
public interface IValidator<T>
{
bool IsValid(T entity);
IEnumerable<string> BrokenRules(T entity);
}
Run Code Online (Sandbox Code Playgroud)
然后我将此验证器注入到我的服务中。如果方法成功/失败,服务可以返回布尔值。发生故障时,“BrokenRules”枚举中包含的附加信息可用。我已在博客文章中记录了这一点:
http://blog.bobcravens.com/2010/09/the-repository-pattern-part-2/
如果您有任何疑问,请告诉我。希望这可以帮助。
鲍勃
| 归档时间: |
|
| 查看次数: |
847 次 |
| 最近记录: |