C# MVC&x2B;WCF:体系结构设计决策

C# MVC&x2B;WCF:体系结构设计决策,c#,wcf,design-patterns,model-view-controller,asp.net-mvc-5,C#,Wcf,Design Patterns,Model View Controller,Asp.net Mvc 5,我目前正在从事一个项目,该项目由一个ASP.NET MVC web应用程序和一个包装在WCF服务中的后端组成。我在过去的项目中使用过MVC和WCF,但我从未负责从头开始设计架构。我希望得到一些关于我当前设计的反馈,以确保我从高层建筑的角度采用了良好的设计实践 下面是一个依赖关系图,它给出了事物的结构: 需要注意的几点: 公共MyApp.Utilities项目适用于需要跨层共享的任何功能。目前它只包含扩展方法 服务契约和数据契约位于两层共享的公共项目中 EntityFramework正在用于数

我目前正在从事一个项目,该项目由一个ASP.NET MVC web应用程序和一个包装在WCF服务中的后端组成。我在过去的项目中使用过MVC和WCF,但我从未负责从头开始设计架构。我希望得到一些关于我当前设计的反馈,以确保我从高层建筑的角度采用了良好的设计实践

下面是一个依赖关系图,它给出了事物的结构:

需要注意的几点:
  • 公共MyApp.Utilities项目适用于需要跨层共享的任何功能。目前它只包含扩展方法
  • 服务契约和数据契约位于两层共享的公共项目中
  • EntityFramework正在用于数据访问
  • 映射实体DTO(数据合约)视图模型
    • 仍在研究这个问题,使用AutoMapper,不完全确定当DTO从表示层传递回来时,我应该如何“重新水化”它们
  • ServiceImplementation只是包含在单独程序集中的业务逻辑的包装器
  • 表示层和服务层将部署到单独的物理服务器上
  • 所有包都包含在解决方案根文件夹中的单个文件夹中,并签入版本控制

这些都是不好的做法吗?

•服务合同和数据合同在两层共享的公共项目中

我会避免这样。这看起来像是额外的工作,但我会将它们分解成单独的名称空间和类,即使这会导致重复。通常情况下,我会避免为不可预见的事情做计划,然而,我从未有过这样一个项目:我的所有数据契约都与我的所有服务契约保持一致。适应差异的黑客行为往往会导致混乱的反模式


这些类中的大多数将具有相同的属性,并且可以使用自动映射器轻松地映射它们。

•服务契约和数据契约位于两个层之间共享的公共项目中

我会避免这样。这看起来像是额外的工作,但我会将它们分解成单独的名称空间和类,即使这会导致重复。通常情况下,我会避免为不可预见的事情做计划,然而,我从未有过这样一个项目:我的所有数据契约都与我的所有服务契约保持一致。适应差异的黑客行为往往会导致混乱的反模式


这些类中的大多数将具有相同的属性,并且可以使用自动映射器轻松地映射它们。

您上面提出的体系结构与我在项目中使用的体系结构非常相似。 一些评论:

  • 数据契约(实体框架)不在公共项目中
  • 我们目前正在使用AutoMapper在实体框架模型和服务模型(简单和复杂类型)之间以及实体框架模型和服务模型之间进行映射 服务模型和视图模型
  • 我们在DAC、服务层和表示层中有接口实现,使用依赖注入(我们使用Ninject)来 使层更“可测试”,因此我们在所有这些方面都有契约 层次
  • 表示基本上是带有restful方法的WebAPI

它工作得很好,我看不出您的架构有任何问题。

您上面提出的架构与我在项目中使用的架构非常相似。 一些评论:

  • 数据契约(实体框架)不在公共项目中
  • 我们目前正在使用AutoMapper在实体框架模型和服务模型(简单和复杂类型)之间以及实体框架模型和服务模型之间进行映射 服务模型和视图模型
  • 我们在DAC、服务层和表示层中有接口实现,使用依赖注入(我们使用Ninject)来 使层更“可测试”,因此我们在所有这些方面都有契约 层次
  • 表示基本上是带有restful方法的WebAPI

它工作得很好,我看不出您的架构中有任何问题。

这个高级别的设计看起来还不错,但问题在于细节,而且这在很大程度上取决于具体的工作领域。。对“普通”DLL要非常小心-它们往往会变成“我不知道在哪里或设计不支持bin的所有东西”。在我看来,最重要的是遵循SOLID,并且非常强调依赖注入-我认为从项目的长期(也是短期)来看,这将是好代码与非好代码之间的区别-在这个高层次上的设计看起来不错-但魔鬼在于细节,而且它在很大程度上取决于具体的工作领域。。对“普通”DLL要非常小心-它们往往会变成“我不知道在哪里或设计不支持bin的所有东西”。在我看来,最重要的是遵循SOLID,并且非常强调依赖注入——我认为从长远来看(也很短)从我的观点来看,这将是好代码和依赖注入之间的区别——尽管它使代码的可测试性提高了100倍,但我认为主要的好处是,当需求改变/增加时,您只需要添加一些新类,所有这些都“神奇地”完美地结合在一起(至少只要初始设计是好的)@GiladGreen你是对的,这是DI的另一个巨大好处。从我的观点来看,关于依赖注入的一个注意事项——虽然它使代码的可测试性提高了100倍,但我认为主要的好处是,当需求更改/添加时,你只需要添加一些新的类,这一切都是“神奇的”很好地结合在一起(至少只要最初的设计是好的)@GiladGreen你是对的,这是DI的另一大好处。