2017-03-16 22 views
0

重複していません:この質問に対するコメントと回答を参照してください。ASP.NetコアNullReferenceExceptionがユーザーによって処理されませんでした

私はASP.netコア開発にはほとんど新しいです。私はデータベースとしてMySqlを使ってサンプルWeb APIを構築しています。

マイブックモデル:

public class Book 
    { 
     [Key] 
     public long Id { get; set; } 
     [Required] 
     public string Name { get; set; } 
     [Required] 
     public string Author { get; set; } 
     public DateTime CreatedOn { get; set; } = DateTime.UtcNow; 

     public Book() 
     { 

     } 
    } 

    public class WebAPIDataContext : DbContext 
    { 
     public WebAPIDataContext(DbContextOptions<WebAPIDataContext> options) 
      : base(options) 
     { 
     } 
     public DbSet<Book> Books { get; set; } 
    } 

ブックリポジトリ:

public class BookRepository: IBookRepository 
    { 
     private readonly WebAPIDataContext _db; 

     public BookRepository(WebAPIDataContext db) { 
      _db = db; 
     } 

     public Book CreateBook(Book book) { 
      _db.Books.Add(book); 
      _db.SaveChanges(); 
      return book; 
     } 

     public void DeleteBook(long id) 
     { 
      Book book = GetBook(id); 
      if (book != null) { 
       _db.Books.Remove(book); 
       _db.SaveChanges(); 
      } 
     } 

     public List<Book> GetAllBooks() 
     { 
      return _db.Books.AsNoTracking().ToList(); 
     } 

     public Book GetBook(long id) 
     { 
      return _db.Books.FirstOrDefault(o => o.Id == id); 
     } 

     public void UpdateBook(long id, Book book) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public interface IBookRepository 
    { 
     List<Book> GetAllBooks(); 
     Book GetBook(long id); 
     Book CreateBook(Book book); 
     void UpdateBook(long id, Book book); 
     void DeleteBook(long id); 
    } 

と書籍コントローラ:

[Route("api/[controller]")] 
    public class BooksController : Controller 
    { 
     private readonly IBookRepository _books; 

     [HttpGet("")] 
     public IActionResult GetAllBooks() 
     { 
      List<Book> books = _books.GetAllBooks(); 
      return Ok(books); 
     } 

     [HttpGet("{id}")] 
     public IActionResult GetBook(long id) 
     { 
      Book book = _books.GetBook(id); 
      if (book == null) 
      { 
       return NotFound(); 
      } 
      return Ok(book); 
     } 

     [HttpPost] 
     public IActionResult CreateBook([FromBody] Book book) 
     { 
      if (ModelState.IsValid == false) 
      { 
       return BadRequest(ModelState); 
      } 

      Book createdBook= _books.CreateBook(book); 

      return CreatedAtAction(
       nameof(GetBook), new { id = createdBook.Id }, createdBook); 
     } 

     [HttpPut("{id}")] 
     public IActionResult UpdateBook(long id, [FromBody] Book book) 
     { 
      if (ModelState.IsValid == false) 
      { 
       return BadRequest(ModelState); 
      } 

      try 
      { 
       _books.UpdateBook(id, book); 
       return Ok(); 
      } 
      catch (EntityNotFoundException<Book>) 
      { 
       return NotFound(); 
      } 
     } 

     [HttpDelete("{id}")] 
     public IActionResult DeleteBook(long id) 
     { 
      _books.DeleteBook(id); 
      return Ok(); 
     } 
    } 

私は新しい本を作成するために闊歩からPOSTリクエストを行うと、それ私にNullReferenceExceptionエラーを与えます。私は間違って何をしていますか?この最初のケースが機能するために

+0

私はこのポストで提案されたようにnullを処理しようとしましたが、助けにはなりませんでした。 – Nitish

+0

コントローラクラスの_booksはどこに実装に割り当てられますか?現在のところ、実行時に初期化された状態はありません。 DIを使ってコンストラクタでそれをやっていなければ、あなたが行こうとしていたルートであると仮定します。 Dupeではない...ちょうどなぜ彼の事件の誤解。 – mvermef

+0

これはASP.net Coreでの私の最初の試みであり、私はこのチュートリアル(https://joonasw.net/view/building-a-basic-web-api-on-asp-net-core)に従っていました。私は基本的に彼と同じロジックを試しましたが、異なるモデルで試しました。おそらくあなたは私に正しい方法を与えることができますか? – Nitish

答えて

1

あなたがコンテナの中に含まれるように、これはあなたがあなたのIBookRepositoryをフックアップを前提と今startup.cs

public class BooksController : Controller 
{ 
    public BooksController(IBookRepository books){ 
     _books = books; 
    } 
    ... 

に位置ConfigureServices方法で

services.AddScoped<IBookRepository, BookRepository>(); 

を持つことが必要スタートアップクラスのAsp.NETコア。

IF NOTこれはあなたが欠けているものです!

public class BooksController : Controller 
{ 
    public BooksController(){ 
     _books = new BookRepository(); 
    } 

あなたは私はあなたがそれをよく読んでお勧めこの前の依存性注入で働いたことがない場合、また、IOC(制御の反転)で行きます。

+0

さて、これを試してみましょう! – Nitish

+1

はい、最初のソリューションが機能しました!どうもありがとう!私は基本的にチュートリアルを見落としました。 – Nitish

関連する問題