データベースでレコードが見つからない場合に、どのような方法が好ましいかわかりません。 nullを返すFindメソッドやRecordNotFoundException
を返すGetメソッドを記述する方が良いですか?Return(RecordNotFound)レコードがデータベースに見つからない場合は、例外またはnull?
[AuthenticateFilter(UsernameAndSecretKey)]
[Route("api/v1/activities/emails/{id}")]
[HttpGet]
public IHttpActionResult GetEmailActivity(int id)
{
try
{
// business logic service, could use only db service but this way we can do unit tests (just fill bl service method with fake objects)
var service = new EmailActivityBlService();
// 1. use Find method which returns null in case record with provided id does not exist in db
var model = service.FindActivity(id);
if(model != null)
return Ok(model);
return NotFound();
// 2. or is this approach better
// throws RecordNotFoundException in case row by id is not found in database
return Ok(service.GetActivity(id));
}
catch(RecordNotFoundException e) { return NotFound(); }
catch(Exception e) { return InternalServerError(e); }
}
EmailActivityBlService
は(唯一の重要な部分を示す)興味がある場合、誰に次のコードを持っている:私の同僚と話し
private EmailActivityDbService _dbService;
public EmailActivityModel GetActivity(int id)
{
var model = this._dbService.GetActivity(id);
if(model == null)
throw new RecordNotFoundException(); // I suppose System.Data.ObjectNotFound is also suitable
return model;
}
public EmailActivityModel FindActivity(int id)
{
// typical entity framework query
// using(var context = new ..) { return contect.EmailActivity.Where()..SingleOrDefault().ConvertToModel();
return this._dbService.GetActivity(id);
}
UPDATE
、我々は、このソリューションで行くことにしました。 GetActivityではなく、例外を投げるのnullを返す理由として、私はrboeから答えを好む:それはあなたのドメインで発生する可能性がある場合
だからレコードが存在しないことを、nullを返します(私の経験では、これはほとんどの場合あり場合)。レコードが存在すると予想され、レコードが存在しない場合は、例外をスローすることが有効です。
[AuthenticateFilter(UsernameAndSecretKey)]
[Route("api/v1/activities/emails/{id}")]
[HttpGet]
public IHttpActionResult GetEmailActivity(int id)
{
var service = new EmailActivityBlService();
var model = service.GetActivity(id); // returns null in case activity is not found
if(model != null)
return Ok(model);
return NotFound();
}
我々は、メソッド内の任意のtry-catchを回避し、例外が発生したときにグローバルフィルタを置く:
ファイル:App_Start \ WebApiConfig.cs
public class WebApiExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
actionExecutedContext.Response = actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, actionExecutedContext.Exception.Message, actionExecutedContext.Exception);
}
}
ご意見ありがとうございます。 –