使用WCF时,如何将视图、模型和控制器分离为单独的项目

本文关键字:分离 控制器 单独 项目 模型 WCF 视图 使用 | 更新日期: 2023-09-27 18:16:46

背景

我有一个使用n层架构的项目,该项目使用服务外观(WCF(向表示层(ASP.NET MVC(公开业务层和数据层。使用单独的类库(即(将表示层划分为关注点

  • 表示层(ASP.NET MVC(
    ---视图
    ---ViewModels
    ---控制器
    ---存储库
  • 服务层(WCF(
  • 业务层
  • 数据层

控制器调用相应的存储库,存储库又调用服务层。服务层使用数据传输对象(DTO(来促进串行格式的业务对象(即扁平化的业务对象(在网络上的传输。

问题

在表示层中,我需要将DTO映射到它们各自的视图模型对象。当我有一个包含所有视图、视图模型、控制器和存储库的MVC项目时,这很好。但是我想保持类库的分离。这带来了一个问题,因为服务引用只添加到其中一个项目(存储库(中。即其他项目不会识别在服务参考合同中定义的DTO类型,因为不会添加服务合同。

例如,ViewModels项目将无法将DTO映射到ViewModels,因为DTO数据类型无法识别。如果只有数据类型可以通过服务契约访问,我如何能够在表示层中保持这种分离?

使用WCF时,如何将视图、模型和控制器分离为单独的项目

简单/最好的解决方案似乎使DTO成为一个单独的项目(类库(,并引用来自服务层和表示层的项目。

更新:如果他们总是通过服务层获取数据(也就是说,无论他们是否有服务参考链接,他们都已经依赖于你的服务层(,似乎也没那么糟糕(当然仍然不理想(

在ASP.NET MVC架构中,Model(M(并不完全是业务层,它看起来像View Model:

示例

这些类可能在业务层中:

public class Student
{
}
public class Course
{
}

有时我们需要在模型类之间进行组合,因此,在model(在asp.net MVC应用程序中(中,我们可以找到这个类:

public class Education 
{
List<Etudiant> etudiants = new List<Etudiant>();
List<Course> courses = new List<Course>();
}

保持模型部分(BLL层(与UI层(例如asp.net MVC应用程序(之间的分离是一种很好的做法

我基本上保持了相同的体系结构,并将服务引用添加到存储库项目中。我没有在ViewModels项目中有一个处理DTO到ViewModel映射的扩展方法助手类,而是将其添加到了Repositorys项目中,因为这是唯一需要了解DTO数据类型的类。看起来是一个不错的交易。