C# MVC3应用程序,基于现有体系结构

C# MVC3应用程序,基于现有体系结构,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我有一个实体框架驱动的解决方案,在这个解决方案之上,我有一个业务层和一个服务层,将方法公开给我的测试控制台应用程序。控制台应用程序不知道我的实体框架。我有一个转换类,它接受实体框架数据对象,并将它们转换为自定义DTO,这些DTO位于共享库项目中。因此,我的数据库访问层和其他层一样使用共享库 现在,我想尝试构建一个MVC3应用程序。那么,在我的解决方案中将其作为一个单独的项目构建,然后让MVC应用程序的控制器部分引用我当前解决方案的服务层是否正确?例如,我的服务层公开了一个名为“GetAllUse

我有一个实体框架驱动的解决方案,在这个解决方案之上,我有一个业务层和一个服务层,将方法公开给我的测试控制台应用程序。控制台应用程序不知道我的实体框架。我有一个转换类,它接受实体框架数据对象,并将它们转换为自定义DTO,这些DTO位于共享库项目中。因此,我的数据库访问层和其他层一样使用共享库


现在,我想尝试构建一个MVC3应用程序。那么,在我的解决方案中将其作为一个单独的项目构建,然后让MVC应用程序的控制器部分引用我当前解决方案的服务层是否正确?例如,我的服务层公开了一个名为“GetAllUsers”的方法,该方法返回一个列表。然后我获取该列表,并形成一个模型(MVC的M部分),并将其传递给视图。这看起来可以吗?

我不是一个大的专家,但我认为这是可以的,而且是正确的。根据我创建MVC应用程序的经验,将MVC应用程序本身与整个解决方案的其他部分(如数据库、数据库模型或数据库模型类、数据库存储库、业务模型等)分开是正确的。此外,如果您愿意,可以基于您的服务层在MVC应用程序项目中直接创建ViewModel类。即创建一个更多的抽象级别,只使用控制器来发送结果以查看结果,而不是用于处理列表。

< P>到Dima -您可以再次考虑将DTO的映射映射到定制的代码> VIEWSMODS类,特别适合于视图。(否则,您可能会发现自己必须使用
ViewBag
等将其他数据填充到视图中)

另外,为了确认MVC的“M”实际上是系统的整个后端(DAL、BLL、服务层、DTO、实体等)。我们通常会删除asp.net MVC项目中的模型文件夹,因为其他层位于单独的程序集中,并且被引用/注入。我假设MVC前端是系统的“主要”UI(即同一团队正在开发MVC前端和后端)

一个有待解决的问题是服务层——至少有以下两个选项

  • 您可以认为服务层仅用于“外部”系统使用者,并允许您的控制器直接与BLL交互,甚至(CQRS样式)直接与DAL/存储库交互以进行查询(即服务层=公开的集成接口)。(但是您自己的前端Ajax调用等应该调用MVC控制器方法,而不是服务层IMO)
  • 采用更传统的严格分层方法,将服务层视为通往业务层的网关(即,MVC前端根本不是服务的特殊消费者,必须通过服务层)
  • 使用选项1,您可能需要在控制器中复制服务关注点(安全性、事务边界、日志记录等)。通常控制器仍然需要这些关注点

    使用选项2,例如,如果您使用的是WCF,则应尽可能避免额外的网络(以及序列化/反序列化)开销。因此,如果您发现可以将正在进行的MVC前端和服务层部署到同一物理服务器,则可以配置IoC(或类工厂)将WCF服务契约的实例直接注入控制器(即,您仍然通过定义的WCF契约通过服务层,但没有开销)


    还有选项2,如果您确实有其他系统使用您的服务(除了您自己的前端),建议对接口进行形式化,例如,通过额外的外观/外部使用者映射。否则,每次为您自己的前端向WCF服务添加新属性或方法时,您都会破坏外部使用者的合同。WCF
    MessageContract
    s对于外部系统接口很有用,因为您更好地控制消息格式。

    Craig!=Craig。谢谢!那么,请确认一下……我的工作方法还可以,推荐一下?是否有更好的体系结构,或者这是一个很好的标准?我唯一质疑的是,我将实体对象转换为DTO,然后我想我会在需要时将DTO转换为视图模型我想展示一下。看起来还好吗?