我有业务逻辑层和数据库层(实体框架)。例如,我从DB收到一些数据。
数据库层:
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层的意义 - 只是“抛出”从DB到客户端的结果(在我的情况下是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.在DB层:
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();
}
如果我没有在DB层中抛出异常,我会在BL中获得常见的异常类型(我假设,NullReferenceException)。也许吧,够了吗?任何其他情况,当我可以得到NullReferenceException?
答案 0 :(得分:3)
我会将异常放在您的业务逻辑错误中。数据库层应该简单地报告它返回的内容;在这种情况下没有。这只是一个问题,因为您的业务逻辑需要它。所以,把错误扔到那里而不是在较低的水平。