2010-10-19 51 views
0

首先,我是WCF世界的新手,所以如果这听起来很天真,请原谅我。wcf服务可以松散地解耦

据我了解,与基于ASP.NET网站,其使用ADO.NET传达给数据库,基于Silverlight的应用程序总是需要一个WCF RIA或服务进行通信,以DB。我们知道ASP.NET网站与数据库模型没有紧密耦合,因此可以使用ADO.NET运行任何存储过程,并在网格中查看结果,而不必了解生成的对象模型。

然而,在WCF RIA或服务,你必须总是有它与数据库实体模型同步,并没有在服务中的结果模式不能运行任何存储过程。因此,Silverlight在某种程度上迫使我们与数据库模型紧密结合。

有什么办法,我可以查看在网格上不管PROC得到在后端改变的次数的存储过程的结果?

回答

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 一个 CCESS 大号艾尔),把你的LinqToSql的东西在里面,这防止它实现了WCF的组件分离端点

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

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

+0

是的,我知道WCF提供了一个合约,并且数据对象被序列化以供客户端使用。在我的应用程序中,我有一个可以调用存储过程的linq sql类,而IResult是由设计器自动生成的。只要存储过程没有改变,这个工作就会生效,但是一旦我添加或删除一个列形成结果,我将不得不更新服务。我想知道是否可以通过提供存储的proc名称以及参数来对数据库进行泛型调用(即,像在ADO.NET中使用SqlCommand,CommandType = sp和SqlReader一样) – Hari 2010-10-19 22:15:36

+2

WCF中绝对没有任何东西阻止您使用普通的ADO.NET作为你的数据库层。您只需使用您手动编写的POCO(Plain Old CLR对象),而不是L2S或EF为您生成的类。 – 2010-10-19 22:48:24

+0

@哈里 - 我已经编辑了我的答案以回应你的评论 – slugster 2010-10-19 22:53:04