我正在使用ASP.NET MVC 4设计一个三层应用程序。我使用以下资源作为参考。
到目前为止,我有以下目的。
表示层(PL) (主MVC项目中,中号的MVC被转移到数据访问层):
MyProjectName.Main
Views/
Controllers/
...
业务逻辑层(BLL):
MyProjectName.BLL
ViewModels/
ProjectServices/
...
数据访问层(DAL):
MyProjectName.DAL
Models/
Repositories.EF/
Repositories.Dapper/
...
现在,PL引用BLL,而BLL引用DAL。这样,下层不依赖于其上一层。
在这种设计中,PL调用BLL的服务。PL可以将视图模型传递给BLL,而BLL可以将视图模型传递回PL。
同样,BLL调用DAL层,而DAL层可以将模型返回给BLL。BLL可以依次构建视图模型并将其返回给PL。
到目前为止,这种模式一直在为我工作。但是,我遇到了一个问题,其中某些ViewModel需要在多个实体上进行联接。在普通的MVC方法中,在控制器中,我使用LINQ查询执行join
s,然后执行select new MyViewModel(){ ... }
。但是现在,在DAL中,我无法访问在(在BLL中)定义ViewModel的位置。
这意味着我无法在DAL中加入联接并将其返回给BLL。看来我必须在DAL中进行单独的查询(而不是在一个查询中进行联接),然后BLL将使用这些结果来构建ViewModel。这非常不方便,但是我不认为我应该将DAL暴露给ViewModels。
有什么想法可以解决这个难题吗?谢谢。