![]() |
1
5
老实说,这不是Linq to SQL设计的那种场景。Linq-to-SQL本质上是数据库的一层薄薄的表面;实体模型应该与数据模型紧密地映射,而且通常Linq-to-SQL“实体模型”不适合用作域模型(MVC中的“模型”)。 您的控制器应该使用某种类型的存储库或服务。应该由该对象负责加载特定实体 视图模型所需的任何其他数据。如果你没有一个存储库/服务,你可以直接将这个逻辑嵌入控制器,但是如果你经常这样做,那么你最终会得到一个脆弱的设计,很难维护-最好从一开始就有一个好的设计。
做
尝试设计实体类以引用
你需要有
一
类应该知道
P、 有些人会坚持 存储库 服务 或 建设者 假设您正在构建一个汽车交易网站,需要显示有关域模型(实际汽车/上市)的信息,以及一些必须单独获取的相关但未链接的信息(假设该特定模型的价格范围)。所以你会有一个这样的视图模型:
视图模型生成器可以如此简单:
方式 更容易维护。 更新:新问题的答案
如果存储库负责持久化模型类,则它们是模型的一部分。如果它们处理视图模型(也称为“服务”或“视图模型构建器”),那么它们是表示逻辑的一部分;从技术上讲,它们介于控制器和模型之间,这就是为什么在我的MVC应用程序中,我通常都有
在大多数情况下,您会希望通过构造函数传递它。这允许您共享相同的
这是错误的。视图模型不是您的模型。视图模型属于视图,它独立于域模型(这就是“M”或“Model”所指的)。如上所述,我建议创建一个
请参阅上面的几段-存储库应该注入
主要是为了在需要时更改持久性模型。也许你认为LINQtoSQL过于面向数据,你想切换到更灵活的实体框架或NHiBernt。也许您需要实现对Oracle、mysql或其他一些非Microsoft数据库的支持。或者,您可能完全打算继续使用Linq to SQL,但希望能够为控制器编写单元测试;唯一的方法是将模拟/假存储库注入控制器,并且要使其工作,它们必须是抽象类型。
这或多或少是我最初推荐的,尽管您已经使用了一个很难调试的投影。最好在单独的代码行上调用SP,然后将结果合并起来。 此外,不能为域或视图模型使用接口类型。它不仅是错误的隐喻(模型代表了应用程序的不可改变的规律,它们不是 除非现实世界的需求发生了变化,否则是不可能的;接口不能被数据绑定,因为在发布时没有任何东西可以实例化。
所以是的,你的想法是对的,除了(a)而不是
如果你有一个24小时的最后期限,那么你仍然可以 把所有这些逻辑直接推到控制器中。只是不要让它太久,否则你的控制器将(d)演变成上帝对象憎恶。 |
![]() |
2
1
替换
然后可以直接从数据上下文调用该函数,获取结果并将其传递给视图模型。
|