有关Web API的所有示例和服务器上的返回资源状态如下所示:
var resource = repository.Get(id);
if(resource == null)
{
return NotFound();
}
return resource;
这适用于最简单的架构。
但是有很多业务逻辑和服务调用该存储库,我看不出我仍然可以使用这种方法。
在我们的架构中,每个web api控制器都会注入一个服务,每个服务都会获得一个或多个存储库甚至其他服务注入。
现在我的服务没有简单的Get方法返回资源。
这些服务可能如下所示:
action(string materialNumber)
{
var pdf = service.CreateProductPDF(materialNumber);
return pdf;
}
class Service
{
public XXX CreateProductPDF(string materialNumber)
{
// Do repository call here but HOW do I let the action know that the materialNumber does not exist?
// Create product pdf from materialNumber
}
}
我的问题在上面的评论中。
答案 0 :(得分:0)
您的域应该能够将值对象从存储库传输到服务。
值对象可以被称为DomainResult
,它应该包含您要求的域对象以及域验证信息(即已损坏的规则 >)。
例如:
// It's an OVERSIMPLIFICATION, but it should give you the hint
// to keep you in the right track...
// This code requires C# 6 as it's using expression-bodied properties!
public class DomainResult<TResult>
{
public TResult Result { get; set; }
public List<BrokenRule> BrokenRules { get; } = new List<BrokenRule>();
public bool IsSuccessful => BrokenRules.Count == 0;
}
例如,您的方法可能如下所示:
class Service
{
public DomainResult<PdfDocument> CreateProductPDF(string materialNumber)
{
DomainResult<PdfDocument> result = repo...;
// result object might contain a BrokenRule containing a code/message
// "Product couldn't be created because materialNumber wasn't found"
return result;
}
}
然后,您可以在Web API资源方法中返回404
,具体取决于域事务期间哪些规则已被破坏。此外,您应该使用API控制器中的ModelState
将这些损坏的规则消息添加到ModelState.AddModelError
。