2009-12-31 70 views
1

我有一个ASP.NET MVC Web应用程序,其控制器使用WCF调用不同服务器上的域模型。域代码需要与数据库交谈,并且访问数据库服务器并不总是可以从Web服务器(取决于客户站点)进行访问,因此使用WCF可以访问允许我的代码连接到数据库的位置服务器。避免必须映射WCF生成的复杂类型

这是可配置的,所以如果控制器能够直接访问数据库服务器,那么我使用域对象的本地实例而不是使用WCF。

可以说我有一个页面,要求人的细节,如年龄,姓名等,这是一个复杂的类型,它是这样对我的WCF操作参数:

[OperationContract] 
string SayHello(Person oPerson); 

当我生成客户端代码(例如;通过在我的客户端添加服务引用)我得到一个单独的Person类来实现wcf合同。客户端,一个MVC网络应用程序,可以使用这个客户端类作为视图模型,一切都很好。我将其直接传递给WCF客户端方法,并且这一切都非常出色。

如果我的mvc客户端应用程序配置为不使用WCF我有问题。如果我直接从控制器调用我的域对象(假设我有一个域访问工厂/提供程序设置),那么我需要原始Person类而不是wcf生成的Person类。这导致我的问题是,如果我不使用WCF,我将不得不执行从一个对象到另一个对象的映射

这样做的主要问题是有许多域对象需要映射并出错可能会引入诸如在未来更改中遗忘的新属性

我正在学习并尝试使用WCF和MVC,可以帮助我了解在此方案中我的选项是什么?我相信会有一个讨巧的这个给定的WCF和MVC的扩展

感谢

回答

1

看来,你实际上并没有试图用一个面向服务的架构。在这种情况下,您可以将域对象放入单个程序集中,并在WCF服务和客户端之间共享。创建客户端时,使用“添加服务参考”,然后在“高级”选项卡上选择“共享类型”。要么选择共享所有类型,要么选择要共享其类型的程序集列表。

+0

谢谢你钉它!我已经将域数据对象放在单独的程序集中,但不知道“共享类型”的用途。这为我节省了很多工作,给我留下了深刻的印象。 生成的客户端实现了不同的服务接口,所以我不能抽象服务提供商像我想,但这仍然是一个伟大的结果。 这将是很好,如果我能共享服务接口太多,所以我可以有一个工厂类,返回服务实例(无论是WCF或本地)他们只需要调用方法。相反,我必须在提供程序类分开使用实例,但是,这不是一个大问题 – 2009-12-31 16:25:03

+0

我用的ChannelFactory的建议是很简单排序的服务接口问题。现在我可以使用我的服务接口的实例,它使用WCF或不使用。完善 – 2010-01-01 19:25:01

0

完善的服务为导向的架构决定了您使用基于消息通信,无论你的服务是否是另一个机器,在另一个进程中,在另一个应用程序域或您的appdomain中。您可以使用具有不同绑定的不同端点来利用基于服务位置的链接速度(http,tcp,命名管道),但使用该服务的代码将保持不变。

0

这可能不是最简单或最不耗时的答案,但您可以做的一件事是避免使用“添加服务引用”选项,然后将您的合同接口复制到您的MVC应用程序并启动与WCF的连接手动无需自动创建服务代理。这将允许您为模型对象使用一组类,并且您可以明确控制何时使用WCF。

Michelle Leroux Bustamante在WCF上有很好的网络直播,我想在第二集中她解释了如何做到这一点。看看这里:http://www.dasblonde.net/WCFWebcastSeries.aspx

希望这有助于!

+0

感谢我要去寻找到这可能意味着我能避免服务接口问题,我在约翰·桑德斯的回答响应提 – 2009-12-31 16:44:12

0

一个声音选项是你总是使用WCF,即使客户端和服务器在同一个进程中,正如Aviad指出的那样。

另一种选择是定义接口上的服务契约,并将这些契约与数据契约一起放入一个在客户端和服务器之间共享的程序集。在客户端,不要使用svcutil或服务引用;而是使用ClientFactory<T>

这样,你的客户端代码将使用相同的接口和类作为服务器。

+0

期待到现在这样感谢 – 2009-12-31 16:54:44