Answers:
您的第二个和第三个选项是相同的。MVC中的M不是数据模型,而是域模型。这包括持久性,无论是直接完成还是通过ORM进行,都完全正确。
控制器应该管理站点的流程,并将内容传递到域(有时通过服务层)进行处理,因此从那里持久存在是错误的-或至少在语义上不舒服。
实际上,MVC主要是一种UI实现模式,因此这个问题有些争议。但是,实际上只有两个大图选项。您的控制器通常使用1)某种服务层或2)Active Record模式调度请求以加载或保存模型中的实体。
服务层可以采用多种形式中的任何一种,尽管我个人偏爱使用聚合根实体的存储库抽象,其具体实现将与某种ORM,轻量级DAO或某些非关系存储的API(如果对应用程序有意义)。
Active Record模式意味着您的模型对持久性负责,尽管它通常意味着某种类型的基类管理到您商店的映射,所以您的模型并没有真正涉及到持久性。
基本上,控制器调度对持久对象的请求,无论这是对存储库,UnitOfWork实现的调用,还是对实体的Save方法的调用。如果使用存储库,则模型对象是持久性忽略的。
我见过的大多数高级MVC示例都有一个单独的infrastructure
层,其中包含实际的数据库实现代码(即,对NHibernate,EF或Linq或您的数据层的特定调用),而“模型”层(通常也是“域”层)具有定义数据服务的接口。
MVC中的标准做法是在M(odel)层中包括数据结构和持久性。
模型层不仅包含要在应用程序中使用的类(POCO等)。它们包括这些类的存储库。
一个示例是一个存储库,其中有许多数据类实例,即:
Clients repository
AllClients()
RecentClients()
ClientByID(int id)
您将能够更好地组织模型域,并且可以通过多种方式访问数据,但是数据/模型层仍将是紧凑且健壮的