2016-10-08 118 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检查),如果它的好,叫这做的所有逻辑服务,并将结果报告给用户。只有在非常简单的教程和指南中,为了简单起见,将逻辑放入控制器操作中。在现实世界的应用程序中,你永远不应该那样做控制器比服务类更难单元测试。

相关问题