我是整个 ASP 世界的新手,我通过构建 C# MVC3/EF4 项目开始涉足。我发现很难避免在我的模型和视图模型中复制一堆代码。考虑一个对象 Foo。我需要用 Foo 做以下事情:
- 在我的数据库中存储 Foo 类型的记录。
- 允许用户查找单个 Foo 的记录(将 Foo 的实例传递给视图)。
- 允许用户创建 Foo 的新实例(将 Foo 的实例传递给表单)。
假设我也有一个类型 Bar。Bar 包含 Foos 的列表。这里有两个要求:
- 用户可以查看 Bar 列表。
- 当用户单击特定 Bar 时,它会显示其所有 Foos。
所以,我的基本对象的草图如下所示:
class Foo
{
string FooName;
int Id;
}
class Bar
{
List<Foo> FooList;
int Id;
string Baz;
}
但是当我开始思考不同的观点时,它开始变得混乱:
- 视图不应该对任何数据成员有任何写访问权。
- 有一个视图采用 Bars 列表但不关心 Bar.FooList。假设我也想做好资源管理并尽快关闭 DbContext(即在对象在内存中之后但在渲染视图之前)。如果我只是将 Bars 列表传递给它,而设计器尝试错误地访问 FooList,我们将收到运行时错误。呸!
好的,我只是为每个具有只读数据成员的视图创建一个不同的 ViewModel,没问题。
- 但是数据库模型和表单模型都需要附加 DataAnnotations,说明需要哪些字段、字符串的最大长度等。如果我创建单独的表单模型和数据库模型,那么我最终不得不复制所有这些注释。呸!
所以,这就是我的架构困境:我想要简洁的视图模型,将视图限制为仅读取它们应该访问的数据。我想避免到处重复数据注释。而且我希望能够尽快积极地释放我的数据库资源。实现我的目标的最佳方式是什么?