MVC + 3层;ViewModels在哪里发挥作用?


11

我正在使用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查询执行joins,然后执行select new MyViewModel(){ ... }。但是现在,在DAL中,我无法访问在(在BLL中)定义ViewModel的位置。

这意味着我无法在DAL中加入联接并将其返回给BLL。看来我必须在DAL中进行单独的查询(而不是在一个查询中进行联接),然后BLL将使用这些结果来构建ViewModel。这非常不方便,但是我不认为我应该将DAL暴露给ViewModels。

有什么想法可以解决这个难题吗?谢谢。

Answers:


18

MVC主项目,其中MVC的M移到了数据访问层

常见的误解。该MMVC有什么,做数据尽管声称这样的例子很多和教程。

M 是您的ViewModel,应该驻留在您的MVC项目中。您在BLL中拥有的ViewModel实际上被命名为DataContracts或BusinessModels。

在您的控制器中,您可以进行以下比较:

Get(id):
    dataContract = _service.Get(id);
    viewModel = Map(dataContract);
    return viewModel

在您的服务中,如下所示:

Get(id):
    dataModel = _dataAccess.Get(id);
    dataContract = Map(dataModel);
    return dataContract;

在DataAccess中,您可以根据请求的对象执行正确的联接。但是,您当然可以在需要时自由地向DataAccess添加自定义方法,因此您的服务可以调用这些方法:

GetWithBars():
    dataModels = _repository.Query("select from foos join bars");
    return dataModels;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.