【问题标题】:How do you separate views, models and controllers into separate projects when using WCF?使用 WCF 时如何将视图、模型和控制器分离到单独的项目中?
【发布时间】:2014-09-29 22:12:15
【问题描述】:

背景

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

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

控制器调用各自的存储库,这些存储库又调用服务层。 服务层使用数据传输对象 (DTO) 来促进以序列化格式(即扁平化的业务对象)通过网络传输业务对象。

问题

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

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

【问题讨论】:

    标签: c# wcf asp.net-mvc-4 n-tier-architecture


    【解决方案1】:

    简单/最佳的解决方案似乎使 DTO 成为一个单独的项目(类库),并从您的服务层和表示层引用它们。

    更新:如果他们总是通过服务层获取数据(也就是他们已经依赖于您的服务层,无论他们是否有服务参考链接)

    【讨论】:

      【解决方案2】:

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

      示例

      这些类可能在业务层:

      public class Student
      {
      }
      
      public class Course
      {
      }
      

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

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

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

      【讨论】:

        【解决方案3】:

        我基本上保持了相同的架构,并将服务引用添加到存储库项目中。我没有在 ViewModels 项目中处理 DTO 到 ViewModel 映射的扩展方法帮助程序类,而是将其添加到 Repositories 项目中,因为这是唯一需要了解 DTO 数据类型的类。似乎是一个不错的权衡。

        【讨论】:

          猜你喜欢
          • 2019-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-06
          相关资源
          最近更新 更多