【问题标题】:What are the best practices for calling a WCF service from ASP .NET MVC3?从 ASP .NET MVC3 调用 WCF 服务的最佳做法是什么?
【发布时间】:2012-07-11 12:26:09
【问题描述】:

我负责 ASP .NET MVC 3 Web 应用程序的解决方案架构,并希望确保我遵循最佳实践。我以前曾使用过 MVC 3,但使用的是其他人组合的解决方案。

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

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

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

【问题讨论】:

    标签: asp.net-mvc-3 wcf


    【解决方案1】:

    我的 2 美分

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

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

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

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

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

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

    【讨论】:

    • 谢谢,我相信这回答了我的问题:)
    【解决方案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 服务似乎已经这样做了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多