没有记录 - 抛出异常的地方

时间:2016-02-18 16:27:51

标签: c# asp.net-mvc architecture business-logic-layer

我有业务逻辑层和数据库层(实体框架)。例如,我从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?

1 个答案:

答案 0 :(得分:3)

我会将异常放在您的业务逻辑错误中。数据库层应该简单地报告它返回的内容;在这种情况下没有。这只是一个问题,因为您的业务逻辑需要它。所以,把错误扔到那里而不是在较低的水平。

相关问题