我做了很多研究,包括这里的 SO,我似乎找不到明确的方向。我目前有一个 ASP.NET MVC3 应用程序,其服务层位于存储库之上。
在我的服务层中,我具有以下功能:
public class MyService{
public void CreateDebitRequest(int userId, int cardId, decimal Amount, .... )
{
//perform some sort of validation on parameters, save to database
}
public void CreateCreditRequest(.....)
}
//perform some sort of validation on parameters, save to database
}
public void CreateBatchFile()
{
//construct a file using a semi-complex process which could fail
//write the file to the server, which could fail
}
public PaymentTransaction ChargePaymentCard(int paymentCardId, decimal amount)
{
//validate customer is eligible for amount, call 3rd party payments api call,
//...save to database, other potential failures, etc.
}
}
我见过有人说参数验证不是很例外,所以抛出异常不是很合适。我也不喜欢传入输出参数(例如字符串)并检查空值的想法。我已经考虑实现一个 ValidationDictionary 类,并使其成为任何给定服务类的属性(它将包含一个 IsValid 布尔值和一个错误消息列表,并且可以在服务层中的任何给定函数调用之后检查以查看如何事情过去了)。运行任何给定函数后,我可以检查 ValidationDictionary 状态:
var svc = new MyService();
svc.CreateBatchFile();
if (svc.ValidationDictionary.IsValid)
//proceed
else
//display values from svc.ValidationDictionary.Messages...
我不喜欢这一点的是,我必须为每个服务层函数调用更新它,以避免让它保留旧值(如果我选择不将它用于许多或大多数函数,人们仍然会期待它在运行任何给定函数后具有有意义或空值)。我考虑的另一件事是为每个可能具有详细验证信息的函数调用传入 ValidationDictionary,但随后我又回到使用 out 参数...
大家有什么建议吗?我似乎想不出任何干净的方法来做到这一点。有时为函数返回 null 就足够了,但有时我希望将更多的验证信息传递回调用者。任何意见,将不胜感激!
编辑澄清: 我的服务层不知道它是一个 MVC 应用程序正在使用它。服务层只有某些公共函数,例如 CreateBatchFile() 或 AddDebitRequest()。有时返回 null 足以让消费者(在这种情况下是控制器,但可能是其他东西)知道发生了什么,有时消费者希望从服务层获得更多信息(如果消费者是,则可能传递给 ModelState控制器)。我如何从服务层本身冒泡这个?