在asp.net mvc中向模型添加查询

本文关键字:模型 添加 查询 asp net mvc | 更新日期: 2023-09-27 18:25:13

我的问题是,如何在asp.net mvc中向模型添加自定义查询,我看过的所有教程都是在控制器中进行查询的。

到目前为止,在我的阅读中,所有的内容都表明控制器不应该知道数据库,所有的查询都应该在模型中进行,但我似乎找不到任何这样的例子。

我试着这样做,但我在模型中没有可用的DbContext,那么我应该怎么做呢?

在asp.net mvc中向模型添加查询

有多种方法可以实现这一点,每种方法都有自己的优缺点。这里有几个学徒:

1) 领域模型模式
领域模型模式的作者Martin Fowler提供了这个定义(Fowler,2003):

包含行为和数据的域的对象模型。

使用这种模式,您的域模型将定义行为,这些行为可能会也可能不会转换为DB查询。

2) 存储库模式

使用存储库将检索数据并将其映射到实体模型的逻辑与作用于模型的业务逻辑分离。业务逻辑应该与构成数据源层的数据类型无关。例如,数据源层可以是数据库、SharePoint列表或Web服务。

正如@Mehrdad所指出的,使用这种模式可以释放控制器DB问题,并且所有DB逻辑都保留在一个位置。

3) 命令查询分离模式(我最喜欢)

它指出,每个方法都应该是执行操作的命令,或者是向调用方返回数据的查询,但不能同时是两者。换句话说,提出一个问题不应该改变答案。更正式地说,只有当方法是参照透明的,因此没有副作用时,它们才应该返回值。

注意:这是CQS而非CQRS模式

CQS和Repository模式的区别在于,使用Entity Framework,DbContext已经为您封装了Repository模式(DbContext是工作单元,DbSet是存储库)。因此,创建另一个存储库层是多余的。CQS为您提供了对查询/命令的细粒度控制,并允许您通过decorator扩展它们,decorator可以处理额外的逻辑,而不会污染您的核心业务逻辑。以下是关于CQS的一些很棒的链接:

  • 与此同时。。。在我的体系结构的命令端
  • 从命令处理程序返回数据
  • 与此同时。。。在我的体系结构的查询端

这个答案是一个很好的例子,说明了如何将存储库模式与CQS一起使用。

所有这些都可能是压倒性的,所以我建议你慢慢来,使用这些模式来实现概念验证项目,并决定哪一个更适合你的整体架构。

您通常可以使用Repository模式,例如,如果您有一个用户实体:

public class UserRepository:IUserRepository{
  public List<User> GetUsers()
  {
     //Your code and query here
  }
  public void AddUser(User user)
  {
     //Your code and query here
  }
}

然后将这个类传递给UserController并调用它的函数。正如你所看到的,我还添加了IUserRepository,这样你就可以在进行依赖注入时使用它