4

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

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

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

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

4

2 回答 2

9

我的 2 美分

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

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

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

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

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

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

于 2012-07-11T12:40:20.097 回答
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 服务似乎已经在这样做了。

于 2012-07-11T12:54:59.017 回答