简单的描述问题吧:
在MVC方案中新建了一个ViewModel对象,该对象属性就是List页面的查询字段。
然后我有一个项目是DAL层,然后需要用到这个VM对象 作为参数传入
这个时候就发现Web项目和DAL层相互耦合了,DAL需要Web里面的VM,Web又需要DAL
的数据接口。
难道要把VM对象定义放到Model项目吗(Model里面定义的是数据库实体对象)
另外我看了一些文章说有的人简单的把VM定义成对象,其实VM应该还可以做一些业务处理,或者返回相关数据,说本来VM该实现的功能都放到control方法里面去实现了。
想有人解释下该如何设计,还是我这种保留三层结构的开发运用到MVC不合适?
你的对象由于比较简单或者设计之初就是以前端需求或者db为主要考虑点,所以导致你的viewobject和dataobject一致,但很多时候这两个玩意是有区别的,不管是在职责和所包含的信息量上
是的啊 前台界面和DAL关联比较紧 基本界面增删改查都是和DAL关联
而MVC需要一个ViewModel 所以这个VM如果是查询界面 就是DAL需要的查询条件
如果是增删改界面 这个VM就是需要DAL后台处理的数据
所以如果中间再多一个VM-》DataOjbect的转换 感觉就弄麻烦了些
我最后的解决方案就是VM就是单纯的属性定义(移到Mode项目了) 如果需要就在Controller里面通过DAL赋值给VM
然后VM和数据库对象都是可以被DAL使用的
@犇牛牛: 简单的项目这样也就随便了,如果是长期的玩意建议不要这样搞,到时候你会发现这种对象会越来越大,会出现一些稀奇古怪的属性,建个对象又耗不了什么时间,如果感觉中间这种对象翻译过程太麻烦,可以直接用automapper这样的东西先顶上去。
@Daniel Cai: 嗯 这方法是可以
DAL需要Web里面的VM
这个是扯淡.vm当然只在web里.dal层当然只返回数据库数据.
web去组装成vm.
上面那个查询界面很多查询字段 比如有20个 然后那个VM有这20个属性
然后页面提交后自动到search方法 传入的就是封装好的这个VM
然后我的DAL查询条件就是需要VM这个对象 这个业务就是这样高度关联的
除非在action方法里面VM和DAL的参数进行转换,不是不可以,可是我们这种业务系统很多都是这样
只想关系简单 不想存在太多对象转换
@犇牛牛: 你就把dal层方法改成20个参数.不传实体.
你高兴的话,ViewMode可以单独一个项目,这样就不会和Model混在一起了。
数据库层DO,传输层DTO,webUi层VO,可以定义3个独立的项目,如果他们之间发生互转,添加项目的引用。
三层object对象互转? 看来是不用管效率了吧 或者这个转换时间损耗可以忽略?