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

时间:2014-10-02 01:03:41

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-4

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

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

我尝试这样做,但我没有在模型中使用DbContext,所以我应该怎么做?

2 个答案:

答案 0 :(得分:1)

有多种方法可以实现这一目标,每种方法都有自己的优点和缺点。以下是一些appraoches:

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

  

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

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

2)Repository Pattern

  

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

正如@Mehrdad指出的那样,使用这种模式可以释放控制器数据库关注点,并且所有数据库逻辑都保留在一个地方。

3)Command Query Separation pattern(我最喜欢的)

  

它声明每个方法应该是执行操作的命令,或者是将数据返回给调用者的查询,而不是两者。换句话说,提出问题不应该改变答案。更正式地说,方法只有在引用透明的情况下才能返回值,因此没有副作用。

注意:这是CQS而非CQRS模式

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

这个answer是如何将存储库模式与CQS一起使用的一个很好的例子。

所有这一切都非常令人难以忍受,所以我建议您花时间,使用这些模式实施Proof-Of-Concept项目,并确定哪一个更适合您的整体架构。

答案 1 :(得分:0)

例如,如果您有用户实体,通常可以使用存储库模式:

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,因此如果您执行依赖注入

,则可以使用它