从ASP .NET MVC3调用WCF服务的最佳实践是什么?

时间:2012-07-11 12:26:09

标签: asp.net-mvc-3 wcf

我负责ASP .NET MVC 3 Web应用程序的解决方案体系结构,并希望确保遵循最佳实践。我曾经使用过一次MVC 3,但是使用了别人放在一起的解决方案。

我主要担心的是Web应用程序将使用WCF服务来检索和更新数据。我不认为直接从我的控制器方法调用WCF服务是最好的做法,但我不确定什么是一个好的替代方案(可能是一个Repository模式,这与WCF一起使用会不常见吗?)。我只想知道我是否可以使用标准模式/练习。

此外,WCF服务是许多其他Web服务的包装器,因此它拥有自己的业务对象类。我不确定是否应该在WCF服务类和MVC应用程序中的模型类之间创建另一级抽象。因此,例如WCF服务有一个Reservation类,我是否需要在我的模型中为Web应用程序创建相同的类?

非常感谢任何帮助。 谢谢!

2 个答案:

答案 0 :(得分:9)

我的2美分

  

...我不认为直接从我的控制器调用WCF服务   方法是最好的做法,但我不确定什么是好的   替代方案(可能是存储库模式[...])

不,不要做另一个抽象。直接使用您的服务,将代理实例注入您的控制器,然后直接从那里调用WCF方法。如果您愿意,可以创建一个包装类来处理一些WCF错误或错误。

您的应用程序是否允许在最近的WCF之间轻松切换并说出数据库(作为数据源)?如果不远离存储库模式 - 保持简单,愚蠢!

  

此外,WCF服务是许多其他Web服务的包装器   所以它有自己的业务对象类。

不要编写复制粘贴代码,因为它很难维护。如果您需要在其中一个服务中更改一种类型,则必须在其他服务中执行相同的镜像更改。

而是将所有常见业务对象分离到一个单独的项目(核心库)中,并在任何其他解决方案中重用此库。

答案 1 :(得分:2)

Controller负责获取/转换数据,因此它将通过代理与WCF服务进行交互。像这样(在VB.NET中):

'TODO: You could extract the channel creation in a generic reusable method (Of T)
Dim endpoint = New EndpointAddress() 'TODO: Initialize
Dim binding = New BasicHttpBinding() 'TODO: Initialize
Dim factory = New ChannelFactory(Of IYourContract)(binding, endpointAddr)
Dim channel = factory.CreateChannel()

Dim result = channel.YourOperation()

您的WCF服务已经转换了服务对象'进入'业务对象',这样您就可以对待相同的业务对象'作为'模型'在您的UI图层中。如果您具有较轻的页面特定或JSON序列化实体,则可以根据需要创建其他模型。

我通常建议使用服务适配器'在WCF服务上,但在您的情况下,WCF服务似乎已经这样做了。