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

问题描述:

我负责ASP .NET MVC 3 Web应用程序的解决方案体系结构,并希望确保遵循最佳实践。我曾经与MVC 3一起工作过,但使用别人放在一起的解决方案。从ASP .NET MVC3中调用WCF服务的最佳实践是什么?

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

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

任何援助将不胜感激。 谢谢!

我的2美分

...我不认为直接从我的控制器调用WCF服务 方法将是最好的做法,但我不知道一个好 替代方法是什么(也许是一个知识库模式[0121]

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

您的应用程序是否允许在不久的将来在WCF和数据库(作为数据源)之间轻松切换?如果不能远离Repository模式 - 保持简单,愚蠢!

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

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

取而代之将所有常见业务对象分离为单独的项目(核心库),并在其他任何解决方案中重新使用此库。

+0

谢谢,我相信这回答我的问题:) – 2012-07-11 13:49:37

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