1

我正在构建基于SOA的应用程序。我有很多业务服务,我应该把它们作为组件提供给其他应用程序(所以我将使用Web服务-SOAP-)。MVC与网络服务

应用表示层是MVC。

1-模型:包含数据库方法(使用ORM)。

2-控制器:包含对模型方法的调用以及处理简单视图操作的方法。

3-视图:仅包含呈现内容。

因此,你可以给我一个简单的场景如何将Web服务与我的MVC应用程序相结合,我的建议是将模型作为Web服务分开,是吗?

回答

4

我会解决它是这样的:(因人而异)

  • 建立一个数据层组件的外壳,所有的数据访问。称它为DAL。它将包含所有数据访问方法。这将启用重用,但也允许下面的一个应用程序使用的方法。这是您的EF模型可以生存的地方。

  • 构建2个Web项目:MVC和Web服务。每个人都将实施业务逻辑来满足他们各自的要求。他们会根据需要引用并调用DAL来访问数据。如您所述,它们都是表示层服务。一个是用户界面,另一个是远程Web服务使用者的通信端点。

  • 根据需要将两者部署到应用程序服务器上。建议在IIS中创建2个应用程序/站点(即“Web”和“WebServices”)。应用程序的这种分离确保了可以在不影响其他应用程序的情况下更改/更新/更新版本。

  • MVC项目/应用程序仍然会按照正常的模型,视图和控制器。这里最大的改变是模型只会根据需要用于ViewModels。它将包含任何业务逻辑以满足UI要求。其控制器方法将根据需要调用适当的DAL公共方法。

  • Web服务项目/应用程序将能够根据需要独立更改,而数据访问将保留。

+0

您可否详细说说第三点? – Lisa 2011-05-01 16:05:39

+0

你的意思是控制器和视图仍然会使用客户端服务器进行交互? – Lisa 2011-05-01 16:39:11

+0

根本不应使用ASMX。 WCF应该用于所有新的开发。 – 2011-05-01 17:08:11

1

1)将所有服务操作置于界面之后。

2)考虑使用Inversion of Control容器在应用程序中使用依赖注入。这允许你嘲笑你的依赖关系并且更容易地测试你的控制器逻辑。一些示例是Windsor,Ninject,StructureMap

3)考虑为您的视图使用强类型视图模型,而不是您的ORM使用的对象。你需要设置一些映射类来帮助管理这些,但是很多痛苦可以通过使用诸如AutoMapper之类的东西来消除。

下面是一些关于这个问题很好的联系:

1

绝不要使用Web服务的目的使用Web服务:您应该先有一个需要解决的问题,并看到Web服务是解决您的问题的最佳解决方案。因此,根据您的需要,可以以各种不同的方式使用Web服务。

例如,由于您说MVC是您的表示层,您可能希望将Web服务作为模型和控制器之间的层插入。控制器不是直接调用模型(数据层),而是调用Web服务,并为通过SOAP API提供的服务提供基于Web的前端。

另一种选择是让您的MVC前端和SOAP服务访问共同的业务/数据逻辑层,每个层都为同一个后端提供自己的“API”。

但是我再次强调:Web服务不应该被用作寻找问题的解决方案。如果Web服务应该适合您的架构对您来说并不明显,那么如果没有它们,您很可能会变得更好。

+0

我在演示文稿和DAL之间使用了WS。这是HELL。我不会推荐。 – 2013-03-24 21:32:48

+1

@DragosDurlut:感谢您的反馈。你能否详细说明是什么导致它变成地狱?我开始构建自己的体系结构,以便控制器访问目前尚未由Web服务支持的“服务层”,但如果我们稍后可以找到它的价值,那么可能会出现这种情况。我很想知道更多关于你的经历。 – StriplingWarrior 2013-03-25 15:01:18

+1

好吧,首先,对于我们在WS合约中所做的每一项变更,我们都必须对网站进行更改。其次,我们必须创建Dto来与网站中的数据模型对象进行交互。该网站有额外的功能。第三,我们不能在不扰乱客户的情况下对WS进行修改。我们必须通知他们这些变化并等待反馈。然后是调试,这是由一个额外的层更复杂。也许这对你来说不会是同样的情况。祝你好运! – 2013-03-25 16:09:55