ASP.NET MVC + EF 4.1 分层,模型,视图模型

3
我读了一些有关ASP.NET中分层架构的文章和问题,但是阅读太多之后我有点困惑。UI层使用ASP.NET MVC开发,数据访问层我在项目中使用EF。
我想通过一个例子来描述我的问题。假设我有一个简单的博客引擎,包括以下实体:Post、Comment、Category、User。我使用EF数据库方法并将POCO-s生成到我的模型层,然后放到数据访问库的生成datacontext和EDMX中。
在这之上,我有一个业务层。这个业务层负责返回带评论的博客条目等操作。在我的UI层中,我使用ViewModel类,因为为了显示某个条目,我需要在同一个视图上同时显示一个Post实体和一个评论列表以及用户名。
现在我遇到了问题:我的视图不需要User实体的所有细节,只需要名字就可以显示一个post。问题是应该在哪里进行ViewModel和Model类之间的映射?业务层应该干这个吗?还是我应该返回每一个细节的实体,让UI处理映射?业务层是否应该包含ViewModel作为类库?
什么是最好的解决方案呢?

好问题。这是一个两难的局面。人们似乎喜欢这种方法。 - Brett
2个回答

2
问题是我应该在哪里映射我的ViewModels和Model类?
最好在一个单独的映射层中。如果您使用AutoMapper,则可以在ASP.NET MVC项目中的单独文件中声明映射。
业务层应该这样做吗?
绝对不是。业务层不知道任何视图模型。
业务层应该包含ViewModels作为类库吗?
不应该。UI层(ASP.NET MVC应用程序)是唯一知道视图模型的层。当然,如果您愿意,它们可以在单独的类库中,但只有UI层应该引用它。视图模型与视图紧密耦合。而视图是UI的一部分。

那么我的业务层应该返回带有每个细节的模型类,并在WebUI项目中进行映射吗?但是这些模型类是否比它们应该更重?例如,我只需要从我的用户实体中获取一个属性。或者,我应该引入一些新的模型类(我已经阅读了一些关于DTO、业务实体的内容),用于我在模型层或业务层中需要的任务,并将其返回给UI? - norbip
@norbip,是的,领域模型可能比视图模型更重。但这就是业务层返回的内容。如果您使用ORM,可以为关联配置延迟加载。然后,由于映射层仅使用这些业务模型的某些关联来构建视图模型,因此这不会成为问题。 - Darin Dimitrov
只有一个问题。如果我的业务层使用投影查询数据层,由于投影我得到匿名类型,但我想返回一个类型化的对象。这种类型可能与模型层中已经存在的类型不同。在这种情况下,类应该在我的业务层中定义吗? - norbip
1
@norbip,当执行投影操作时,不应返回匿名对象。为了替换匿名对象,类应该在执行投影的同一层中定义。因此,如果您在业务层执行投影,则模型应该在业务层中定义为域模型。 - Darin Dimitrov

1

你好,我更喜欢在UI层中使用ViewModel。我读过Steven Sanderson的书《Pro ASP.NET MVC 3 Framework》,这本书中有很多ViewModel的例子,我推荐你阅读这本书。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接