我有一个ASP.NET MVC Web应用程序,其控制器使用WCF调用其他服务器上的域模型。域代码需要与数据库通信,并且始终无法从Web服务器(取决于客户站点)访问数据库服务器,因此使用WCF到达允许我的代码连接到数据库的位置服务器。
这是可配置的,因此如果控制器能够直接访问数据库服务器,那么我使用域对象的本地实例而不是使用WCF。
假设我有一个页面询问人员详细信息,如年龄,姓名等。这是一个复杂的类型,它是我的WCF操作的参数,如下所示:
[OperationContract]
string SayHello( Person oPerson);
当我生成客户端代码时(例如;通过在我的客户端添加服务引用),我得到一个单独的Person类来完成wcf合同。客户端,一个MVC Web应用程序,可以使用此客户端Person类作为视图模型,一切都很好。我直接将其传递给WCF客户端方法,它们都运行良好。
如果我的mvc客户端应用程序配置为不使用WCF我有问题。如果我直接从控制器调用我的域对象(假设我有一个域访问工厂/提供程序设置),那么我需要原始的Person类而不是wcf生成的Person类。这导致我的问题是,如果我不使用WCF,我将不得不执行从一个对象到另一个对象的映射
这个问题的主要问题是需要映射很多域对象,并且可能会引入错误,例如在将来的更改中忘记的新属性
我正在学习和试验WCF和MVC你能帮我了解我在这种情况下的选择吗?鉴于WCF和MVC的可扩展性,我确信会有一个简单的方法
由于
答案 0 :(得分:1)
您似乎并未尝试使用面向服务的体系结构。在这种情况下,您可以将域对象放入单个程序集中,并在WCF服务和客户端之间共享它。创建客户端时,使用“添加服务引用”,然后在“高级”选项卡上选择“共享类型”。选择共享所有类型,或选择要共享其类型的程序集列表。
答案 1 :(得分:0)
声音面向服务的体系结构要求您使用基于消息的通信,无论您的服务是在另一台计算机上,另一个进程中,另一个应用程序域中,还是在您的应用程序域中。您可以使用具有不同绑定的不同端点,以根据服务的位置利用链接的速度(http,tcp,命名管道),但使用该服务的代码将保持不变。
答案 2 :(得分:0)
这可能不是最简单或最耗时的答案,但您可以做的一件事是避免使用“添加服务引用”选项,然后将合同接口复制到MVC应用程序并手动启动与WCF的连接不自动创建服务代理。这将允许您为模型对象使用一组类,并且您可以明确地控制何时使用WCF。
Michele Leroux Bustamante对WCF进行了一系列精彩的网络直播,我认为在第2集中,她解释了如何做到这一点。请在此处查看:http://www.dasblonde.net/WCFWebcastSeries.aspx
希望这有帮助!
答案 3 :(得分:0)
一个声音选项是你总是使用WCF,即使客户端和服务器在同一个进程中,正如Aviad指出的那样。
另一种选择是在接口上定义服务契约,并将这些与数据契约一起放入客户端和服务器之间共享的程序集中。在客户端中,请勿使用svcutil
或服务引用;相反,使用ClientFactory<T>
。
这样,您的客户端代码将使用与服务器相同的接口和类。