我目前有一个服务层,它基于ASP.NET站点中的服务层验证一文.
根据这个答案,这是一个糟糕的方法,因为服务逻辑与违反单一责任原则的验证逻辑混合在一起.
我真的很喜欢提供的替代方案,但在重新分解我的代码时,我遇到了一个我无法解决的问题.
请考虑以下服务接口:
interface IPurchaseOrderService
{
void CreatePurchaseOrder(string partNumber, string supplierName);
}
Run Code Online (Sandbox Code Playgroud)
基于链接答案的以下具体实现:
public class PurchaseOrderService : IPurchaseOrderService
{
public void CreatePurchaseOrder(string partNumber, string supplierName)
{
var po = new PurchaseOrder
{
Part = PartsRepository.FirstOrDefault(p => p.Number == partNumber),
Supplier = SupplierRepository.FirstOrDefault(p => p.Name == supplierName),
// Other properties omitted for brevity...
};
validationProvider.Validate(po);
purchaseOrderRepository.Add(po);
unitOfWork.Savechanges();
}
}
Run Code Online (Sandbox Code Playgroud)
PurchaseOrder
传递给验证器的对象还需要两个其他实体,Part
并且Supplier
(假设此示例中PO只有一个部分).
如果用户提供的详细信息与数据库中需要验证程序抛出异常的实体不对应,则Part
和Supplier
对象都可以为null.
我遇到的问题是,在此阶段验证器丢失了上下文信息(部件号和供应商名称),因此无法向用户报告准确的错误.我可以提供的最佳错误是"采购订单必须具有关联部件",这对用户没有意义,因为他们确实提供了部件号(它在数据库中不存在).
使用ASP.NET文章中的服务类,我正在做这样的事情:
public void …
Run Code Online (Sandbox Code Playgroud)