我正在使用ASP.NET MVC 4设计一个3层应用程序,我使用了以下资源作为参考。
到目前为止,我有以下建议。
表示层(PL) (主要的MVC项目,其中M的MVC被移动到数据访问层):
MyProjectName.Main
Views/
Controllers/
...MyProjectName.BLL
ViewModels/
ProjectServices/
...MyProjectName.DAL
Models/
Repositories.EF/
Repositories.Dapper/
...现在,PL引用BLL和BLL引用DAL。这样,下层不依赖于上面的一层。
在此设计中,PL调用BLL的服务。PL可以将视图模型传递给BLL,BLL可以将视图模型传递回PL。
另外,BLL调用DAL层,DAL层可以将模型返回给BLL。BLL反过来可以构建一个视图模型并将其返回给PL。
到目前为止,这种模式一直适用于我。但是,我遇到了一个问题,我的一些ViewModels需要加入几个实体。在简单的MVC方法中,在控制器中,我使用LINQ查询来执行joins,然后执行select new MyViewModel(){ ... }。但是现在,在DAL中,我无法访问定义ViewModels的位置(在BLL中)。
这意味着我不能在DAL中加入并将其返回给BLL。看来我必须在DAL中执行单独的查询(而不是在一个查询中加入),然后BLL将使用这些查询的结果来构建ViewModel。这是非常不方便的,但我认为我不应该让DAL接触ViewModels。
我有什么办法解决这个难题吗?谢谢。
发布于 2013-11-08 08:15:06
主要的MVC项目,其中M的MVC被移动到数据访问层
常见的误解。M of MVC与数据无关,尽管有许多例子和教程声称数据与数据无关。
M是您的ViewModel,应该驻留在您的MVC项目中。您在BLL中的ViewModels实际上将被命名为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;发布于 2021-10-15 12:50:24
获得三层体系结构最佳实践的
它们应该是另一个帮助层,称为业务实体层( Business,BEL),其余的所有层都应该引用它,每个类都可以访问它。模型应该放在这里。而在BLL中,您应该执行逻辑操作。
BLL和BEL的引用)DAL和BEL参考资料)BEL参考)https://softwareengineering.stackexchange.com/questions/216874
复制相似问题