У меня есть уровень бизнес-логики и уровень БД (инфраструктура Entity). Например, я получаю некоторые данные из БД.
Уровень БД:
public SmartphonePhotographerResponseManage ResponseManage(int RequestID)
{
SmartphonePhotographerResponseManage response = (from i in db.SmartphonePhotographerResponses
where i.RequestID == RequestID
select new SmartphonePhotographerResponseManage()
{
ResponseID = i.ID,
FormattedAddress = i.EditorialPixlocateRequest.FormattedAddress
}).FirstOrDefault();
return response;
}
Слой BL (самый простой пример, смысл слоя BL - просто "кинуть" результат из БД клиенту (в моем случае ASP.NET MVC, но не важно). Конечно, метод BL может иметь любую дополнительную логику):
public SmartphonePhotographerResponseManage ResponseManage(int RequestID)
{
return _repository.ResponseManage(RequestID);
}
Он работает и работает нормально. Но я хочу создать собственное исключение, если запись не существует (т.е. запись была удалена, но у пользователя есть ссылка на его закладки):
public class RecordNotFoundException<T> : Exception
{
public RecordNotFoundException(T ID) : base(String.Format("No Records for passed ID={0}", ID.ToString()))
{
}
}
У меня есть 2 способа его бросить: 1. На уровне БД:
public SmartphonePhotographerResponseManage ResponseManage(int RequestID)
{
SmartphonePhotographerResponseManage response = (from i in db.SmartphonePhotographerResponses
where i.RequestID == RequestID
select new SmartphonePhotographerResponseManage()
{
ResponseID = i.ID,
FormattedAddress = i.EditorialPixlocateRequest.FormattedAddress
}).FirstOrDefault();
if (response == null)
throw new RecordNotFoundException<int>(RequestID);
return response;
}
или в слое BL:
public SmartphonePhotographerResponseManage ResponseManage(int RequestID)
{
var response = _repository.ResponseManage(RequestID);
if (response == null)
throw new RecordNotFoundException<int>(RequestID);
return response;
}
а затем поймать это исключение на стороне клиента (например, контроллер ASP.NET MVC) и обработать его соответствующим образом. Оба подхода будут работать, но где логичнее генерировать такое исключение?
РЕДАКТИРОВАТЬ: Кроме того, в BL сложно создать это исключение, когда я хочу отредактировать/удалить запись. т.е. У меня есть код:
public async Task AcceptOrDeclineFileAsync(int ElementID, bool accept, string smsSid)
{
var element = (from i in db.SmartphonePhotographerResponseElements where i.ID == ElementID select i).FirstOrDefault();
if (element == null)
throw new CommonLibrary.RecordNotFoundException<int>(ElementID);
element.ApprovedByEditorial = accept;
element.SmsSID = smsSid;
await db.SaveChangesAsync();
}
Если я не выбрасываю исключение на уровне БД, я получаю общий тип исключения (я полагаю, NullReferenceException) в BL. Может, хватит? Любые другие ситуации, когда я могу получить NullReferenceException?