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

4
我负责一个ASP .NET MVC 3 Web应用程序的解决方案架构,并希望确保我遵循最佳实践。我之前曾经使用过MVC 3,但是那是别人组合好的解决方案。
我的主要关注点是Web应用程序将使用WCF服务来检索和更新数据。我不认为直接从我的控制器方法调用WCF服务是最佳实践,但我不确定是否有更好的选择(也许存储库模式,这在与WCF一起使用时是否不寻常?)。我只想知道是否有标准的模式/做法可供使用。
此外,WCF服务是许多其他Web服务的包装器,因此它有自己的业务对象类。我不确定是否应该在MVC应用程序的模型类和WCF服务类之间创建另一层抽象。例如,WCF服务有一个Reservation类,我需要在我的Web应用程序模型中创建相同的类吗?
任何帮助都将不胜感激。 谢谢!
2个回答

9

我的建议

......我认为直接从控制器方法调用WCF服务不是最佳实践,但我不确定是否有更好的替代方案(也许可以使用存储库模式[...])。

不要再增加一层抽象。直接使用您的服务,在控制器中注入代理实例,然后直接从那里调用WCF方法。如果您希望,可以创建一个包装类来处理某些WCF故障或错误。

您的应用程序是否允许在最近的未来轻松切换WCF和数据库(作为数据源)?如果不是,请远离存储库模式-保持简单!

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

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

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


谢谢,我相信这回答了我的问题 :) - King_Nothing

2

控制器负责获取/转换数据,因此它将通过代理与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服务似乎已经在这方面做到了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接