我的问题是,如何在asp.net mvc中为模型添加自定义查询,我看到他们在控制器中进行查询的所有教程。
到目前为止,在我的阅读中,一切都说控制器不应该知道数据库,所有的查询都应该在模型中进行,但我似乎找不到任何这样的例子。
我尝试这样做,但我没有在模型中使用DbContext,所以我应该怎么做?
答案 0 :(得分:1)
有多种方法可以实现这一目标,每种方法都有自己的优点和缺点。以下是一些appraoches:
1)Domain Model Pattern
域模型模式的作者Martin Fowler提供了这个定义(Fowler,2003):
包含行为和数据的域的对象模型。
使用此模式,您的域模型将定义行为,这些行为可能会也可能不会转换为数据库查询。
使用存储库分离检索数据的逻辑,并将其从作用于模型的业务逻辑映射到实体模型。业务逻辑应该与包含数据源层的数据类型无关。例如,数据源层可以是数据库,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,因此如果您执行依赖注入
,则可以使用它