1

これらの2つのクラスがあるとします。新しいリポジトリを作成するのはいつどの時点で決定しますか?

public class Author 
{ 
public int ID {get; set;} 
public string Name{get; set;} 
public virtual ICollection<Book> Books { get; set;} 
} 

public class Book 
{ 
public int ID {get; set;} 
public string Name{get; set;} 
public int AuthorId {get; set;} 
public virtual Author Author{ get; set;} 
} 

私はそのすべてのアクションが、私はこのアドレスに行くAuthorId

受けたBooksControllerお持ちの場合:

/著者/ 1 /書籍

はそれをしませんの現在のAuthorRepositoryを使用するだけですか?

public ActionResult Index(int AuthorId) 
    { 
    return View(_AuthorRepository.GetById(AuthorId).Books) 
    } 

また、リポジトリ内のデータアクセスを維持するためにBookRepositoryを作成する必要がありますか?

public ActionResult Index(int AuthorId) 
    { 
    return View(_BookRepository.GetByAuthorId(AuthorId)) 
    } 

同じことが作成アクションで発生します。どちらが理にかなっているかを判断するのは苦労します。

[HttpPost] 
public ActionResult Create(int AuthorId, BookViewModel book) 
{ 
if(ModelState.IsValid) 
{ 
Book b= new Book(); 
b= AutomapperMagicMethodThatGivesMeABookFromA(book); // 
_AuthorRepository.FindById(AuthorId).Books.Add(b); 
_AuthorRepository.SaveChanges(); 
return RedirectToAction("Index"); 
} 
return View(book) 
} 

またはこの方法。

[HttpPost] 
public ActionResult Create(int AuthorId, BookViewModel book) 
{ 
if(ModelState.IsValid) 
{ 
Book b= new Book(); 
b= AutomapperMagicMethodThatGivesMeABookFromA(book); // 
b.AuthorId = AuthorId; 
_BookRepository.Add(b); 
_BookRepository.SaveChanges(); 
return RedirectToAction("Index"); 
} 
return View(book) 
} 

このようなシナリオを処理するためのアドバイスをいただければ幸いです。 私のコードを自由に批評してください。

ありがとうございました。

ps。私はEFを使っています。

答えて

3

一般的な経験則では、に1つのリポジトリを作成することです。

集約ルートは、「親」のように考えることができ、「子」は親なしでは存在できません。あなたの例では

ブック著者なしでは存在できないので、著者は、集約ルートです。 (FKはこれを証明している)。

したがって、1つのEntity Frameworkオブジェクトセットを使用して、著者と書籍の両方で作業することができるLibraryRepositoryが必要です。

実際には、リポジトリ上のジェネリック型にObjectSetを入力することによって、これらの集約境界をリポジトリに適用します。

あなたが持っているかもしれませんので、上記の例で

public class LibraryRepository : IRepository<Author>, GenericRepository<Author> 
{ 
    public Author FindById(int id) 
    { 
     return _context.SingleOrDefault(x => x.AuthorId == id); 
    } 

    public Book FindById(int bookId) 
    { 
     return _context 
     .Where(x => x.Books.Any(y => y.BookId == bookId)) 
     .Select(x => x.Books.SingleOrDefault(x => x.BookId == bookId)) 
     .SingleOrDefault(); 
    } 
} 

を、_contextは(一般的なリポジトリにTです)ObjectSet<Author>に型付けされた一般的なリポジトリでprotectedプロパティです。

しかし、本を見つけるのはちょっと面倒です。あなた自身の上に "子供"を見つける必要があると分かった場合(e。最初に親を検索せずに)、書籍リポジトリの作成も検討する必要があります。

だから、二つのことに帰着:何を、あなたのアプリケーション

を果たすリポジトリが各画面の必要性を何情報、ユーザーインターフェースについて考えて作成集約境界

  • を強制

    1. その情報(例えば、URL)を識別するための情報が手元にあります。

  • +1

    +1、非常に良い答え。 –

    +0

    まあ、BooksControllerは、ユーザーが望むならば、ただ一つの本を編集/更新することもできなければなりません。 "/著者/ 1 /書籍/編集/ 5"のようなURLに行くことによって、Idによって本を見つけることは間違いなく要求されるでしょう.... BookRepositoryを作成するのに十分な理由はありますか? – ignaciofuentes

    0

    私はユニットテストの面でそれを見るでしょう。コントローラをテストする簡単な方法と、コード内のテスト結果を検証する方法はどれですか?

    関連する問題