我应该如何处理具有服务的 NotFound 404 而不仅仅是简单的存储库
How should I handle NotFound 404 having services and not only simple repositories
有关 Web API 和 return 的所有示例服务器上的资源状态如下所示:
var resource = repository.Get(id);
if(resource == null)
{
return NotFound();
}
return resource;
这适用于最简单的架构。
但是有很多业务逻辑和服务调用该存储库,我不知道如何仍然可以使用这种方法。
在我们的架构中,每个 Web api 控制器都会注入一个服务,每个服务都会注入一个或多个存储库,甚至注入其他服务。
现在我的服务没有简单的获取方法return获取资源。
这些服务可能如下所示:
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
}
}
我的问题在上面的评论里
您的域应该能够将 值对象 从存储库传输到服务。
值对象 可以称为 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;
}
}
然后您可以 return 在您的 Web API 资源方法中 return 一个 404
取决于在域事务期间违反了哪些规则。此外,您应该在 API 控制器中使用 ModelState.AddModelError
将这些违反规则的消息添加到 ModelState
。
有关 Web API 和 return 的所有示例服务器上的资源状态如下所示:
var resource = repository.Get(id);
if(resource == null)
{
return NotFound();
}
return resource;
这适用于最简单的架构。
但是有很多业务逻辑和服务调用该存储库,我不知道如何仍然可以使用这种方法。
在我们的架构中,每个 Web api 控制器都会注入一个服务,每个服务都会注入一个或多个存储库,甚至注入其他服务。
现在我的服务没有简单的获取方法return获取资源。
这些服务可能如下所示:
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
}
}
我的问题在上面的评论里
您的域应该能够将 值对象 从存储库传输到服务。
值对象 可以称为 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;
}
}
然后您可以 return 在您的 Web API 资源方法中 return 一个 404
取决于在域事务期间违反了哪些规则。此外,您应该在 API 控制器中使用 ModelState.AddModelError
将这些违反规则的消息添加到 ModelState
。