可以将wcf服务松散地解耦

时间:2010-10-19 21:45:29

标签: silverlight wcf linq entity-framework

首先,我是WCF世界的新手,请原谅我,如果这听起来很幼稚。

据我所知,与使用ADO.NET与数据库进行通信的基于ASP.NET的网站不同,基于Silverlight的应用程序始终需要WCF或RIA服务与数据库进行通信。我们知道ASP.NET网站没有与数据库模型紧密耦合,因此可以使用ADO.NET运行任何存储过程并在网格上查看结果,而无需了解最终的对象模型。

但是,在WCF或RIA服务中,您必须始终使其与数据库实体模型同步,并且不能在服务中没有其结果模式的情况下运行任何存储过程。因此,在某种程度上,Silverlight迫使我们与数据库模型紧密结合。

有没有办法可以在网格上查看存储过程的结果,而不管proc在后端更改的次数是多少?

1 个答案:

答案 0 :(得分:2)

  

但是,在WCF或RIA服务中,您必须始终使其与数据库实体模型同步,并且不能在服务中没有其结果模式的情况下运行任何存储过程。因此,在某种程度上,Silverlight迫使我们与数据库模型紧密结合。

Bzzzzt !!!错误答案!!

WCF服务根本不必与数据库紧密耦合。实际上,使用WCF服务,您仍然可以实现n层方法:

WCF end point -> calls through to business layer -> calls DAL -> calls database

WCF服务的好处是它可以用于将业务层公开给各种断开连接的松散耦合客户端(或使用者 - 他们不一定是UI客户端)。暴露的所有内容都是作为一个接口完成的--WCF服务提供了一个它保证满足的合同。通过该接口返回的数据对象可以是我喜欢的任何东西(只要它可以跨WCF边界序列化)。它不必是一个DataTable或镜像我的数据库结构的数据对象。

我无法对RIA服务发表评论,因为我没有和他们一起玩过。我的理解是,它们只是WCF服务,为方便起见为您生成了一堆东西,这意味着它们可能与您的数据库结构非常相似。这样做的方法是花更多的时间来创建自己的WCF服务。其他回答者可能会详细说明,但是:)

编辑:看来实际问题是您的数据检索机制是紧密耦合的。可以通过多种方式解决此问题,以隔离更改的影响(请注意,这不是详尽的列表):

  • 确保您的WCF调用返回类型对象 - 即使与数据库紧密耦合,对象类型仍保持不变,即使其内部可以更改(即,如果您添加另一个属性)因此,在向数据库表中添加另一列时,您不需要更改WCF接口

  • 创建一个单独的程序集,实现从数据库中检索数据。这将成为你的DAL( D ata A ccess L ayer),将你的LinqToSql内容放在那里,这使它与实现的程序集分开WCF端点

  • 将您从数据库返回的数据转换为更通用且不可知的轻量级数据对象,然后再通过WCF边界(数据传输对象 - DTO)

  • 使用代码生成工具(有很多)根据您的数据对象定义生成WCF接口