【问题标题】:handling not found object in repository处理存储库中未找到的对象
【发布时间】:2014-11-24 14:36:30
【问题描述】:

我有一个外部 dll,其中定义了以下内容

namespace MoviesLibrary
{
    public class MovieDataSource
    {
        public MovieDataSource();

        public int Create(MovieData movie);
        public List<MovieData> GetAllData();
        public MovieData GetDataById(int id);
        public void Update(MovieData movie);
    }
}

我正在从存储库调用此 dll 以在我的 webapi 应用程序中执行 CRUD,现在在我的存储库中我正在编写 GetMovieById 方法,如果在存储库中找不到电影,我很困惑返回什么以及更合适的方法是什么在 webapi 中处理这个?

电影存储库

 public Movie GetMovieById(int movieId)
        {

            MovieData movieData = new MovieDataSource().GetDataById(movieId);
            if (movieData != null)
        {
            return MovieDataToMovieModel(movieData);
        }
        else
        {
            ??
        }
    }

MoviesController

/// <summary>
/// Returns a movie
/// </summary>
/// <param name="movie">movieId</param>
/// <returns>Movie</returns>
   public Movie Get(int movieId)
    {
    //try
    //{
        var movie = repository.GetMovieById(movieId);
        if (movie == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        return movie;
    //}
    //catch (Exception e)
    //{
    //    if (e is HttpResponseException)
    //    throw new HttpResponseException(HttpStatusCode.NotFound);
    //}
}

【问题讨论】:

    标签: c# asp.net exception-handling asp.net-web-api


    【解决方案1】:

    通常,如果主键未找到实体,则应抛出异常。
    根据用例,您可以在存储库中放置两种方法(以及与存储库一起使用的外部代码):

    public MovieData GetDataById(int id); // this throws an exception, if not found
    public MovieData GetDataByIdOrDefault(int id); // this returns null, if not found
    

    如果实体必须出现在数据源中,则调用第一个;如果实体可以出现在数据源中,则调用第二个。

    【讨论】:

    • thnx dennis,但是在该方法的 else 部分中要写什么?还有一件事,然后是 web api get 方法,我不应该检查这个(movie == null)?
    • 这取决于GetDataById 的实现。我不知道它如何从存储中检索数据。此外,您的层次结构看起来是多余的,因为 MovieDataSourceMovieRepository 似乎具有相同的功能。
    • 什么类型的异常适合这种情况?
    • @demonicdaron,IMO,这必须抛出自定义 EntityNotFoundException(或类似)。不幸的是,现代 .NET 中没有开箱即用的。
    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多