2016-10-08 8 views
2

私はasp.netコアを使用しています。コントローラでモデルを使用する基本的な方法は次のとおりです。データクラスはいつ必要ですか?

public class BookController : Controller 
{ 
    private readonly ApplicationDbContext _context { get; set; } 

    public BookController(ApplicationDbContext context) 
    { 
     _context = context; 
    } 

    public IActionResult Create(Book model) 
    { 
     // adding new model 
    } 

    public IActionResult Edit(Book model) 
    { 
     // modifying the model 
    } 

    public IActionResult Delete(Book model) 
    { 
     // removing the model 
    } 
} 

私の質問:コントローラ内にコードを実装する必要がありますか?それを別のクラスに実装しなければならないのですか?

このような何か:

public interface IBook 
{ 
    int Add(Book book); 

    int Update(Book book); 

    int Remove(Book book); 
} 

public class BookData : IBook 
{ 
    private readonly ApplicationDbContext _context { get; set; } 

    BookData(ApplicationDbContext context) 
    { 
     _context = context 
    } 

    public int Add(Book model) 
    { 
     // ... 

     return _context.SaveChanges(); 
    } 

    // other implements... 
} 

次に、コントローラ内部でそれを呼び出す:インタフェースについては

public IActionResult Create(Book model) 
{ 
    var bookData = new BookData(_context); 
    int result = bookData.Add(model); 

    // ... 
} 

、私はそれがケースのために有用である可能性があると思う:私は同じ必要とする多くのコントローラを持っていますアクション/メソッド名。

例:MessageControllerは、少なくとも3つの操作/方法が必要です(Create/Add,Edit/UpdateDelete/Remove)。それは、NotificationControllerクラス、CommentControllerクラス...だから

に同じですが、インターフェースが改善することができます。

public interface IMyService<T> where T : class 
{ 
    int Add(T model); 

    int Update(T model); 

    int Remove(T model); 
} 

public class MyService<T> : IMyService<T> where T : class 
{ 
    private readonly ApplicationDbContext _context { get; set; } 

    public MyService(ApplicationDbContext context) 
    { 
     _context = context; 
    } 

    public int Add(T model) 
    { 
     Type type = typeof(model); 

     if (type == typeof(Book)) 
     { 
      // adding new book model 
     } 
     else if (type == typeof(Comment)) 
     { 
      // adding new comment model 
     } 

     // ... 

     return -1; 
    } 

    // other implements... 
} 

私が何かを誤解していますか?

答えて

2

私がデータクラスで正しく読んだら、実際にはリポジトリ(永続化レイヤーの抽象化)を意味します。永続性ロジックは、常にクラスの背後に(リポジトリパターン、コマンド/クエリパターン、または要求ハンドラ経由で)カプセル化し、サービスクラスのコンテキストを直接使用する代わりに使用する必要があります。

つまり、の代わりにBookDataをコントローラに直接注入することができます。現在の実装で失うと考えるべき点の1つは、作業単位パターンです。今すぐ追加するたびに即座にデータが保持されます。

これはあなたが望むものではない可能性があるので、Add/Remove/Updateメソッドの外に_context.SaveChanges();を移動し、明示的に呼び出す必要があります。これにより、10個のレコードを挿入することができ、いずれか1つが失敗すると、データベースには何も保存されません。

各挿入後に_context.SaveChanges();を呼び出して、8番目(10個)のレコードにエラーが発生した場合、7は永続化され、3は失われ、矛盾したデータが得られます。

コントローラにはロジックが含まれてはいけません。入力モデル(ModelState.IsValidチェック)の検証は短く、OKならば、すべてのロジックを実行して結果をユーザーに報告するサービスを呼び出します。非常に単純なチュートリアルとガイドのロジックでのみ、簡単にするためコントローラアクションに入れられます。実世界のアプリケーションでは、決して実行しないでください。コントローラは、サービスクラスよりも単体テストがはるかに難しい。

関連する問題