2016-10-08 76 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/AddEdit/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注入您的控制器而不是ApplicationDbContext。在當前的實施中,你應該考慮失去的一件事是工作單元模式。現在,每個添加都會立即保存數據。

這可能不是您想要的,所以您應該將_context.SaveChanges();移動到Add/Remove/Update方法的外部並明確調用它。這使您可以插入10條記錄,如果其中一條記錄失敗,則不會將任何內容保留到數據庫中。

但是,如果在每次插入後調用_context.SaveChanges();,並且在第8(10)條記錄中出現錯誤,則7將會持續存在,3將會丟失,並且會得到不一致的數據。

控制器不應包含任何邏輯可言,只能做輸入模型的簡短的驗證(ModelState.IsValid檢查),如果它的好,叫這做的所有邏輯服務,並將結果報告給用戶。只有在非常簡單的教程和指南中,爲了簡單起見,將邏輯放入控制器操作中。在現實世界的應用程序中,你永遠不應該那樣做控制器比服務類更難單元測試。

相關問題