.NET_STAR

打造技术团队,愿与您共同开创事业!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::

对于moss2007里面的BDC这一块的内容,是新加进来的特性。这块功能十分类似于java里面的ORM,当然实现上面肯定是有质的区别。Bdc提供了一种数据共享的业务,为连接后台和表层业务数据建立了桥梁。实际上bdc为上层应用提供服务,实例化以后其实就是数据实体,简单的说就是Entity,我们不用担心bdc如何提供的这些实体,因为很多东西都已经在LobSystem里面处理了。只需要调用就可以,并且这些实体可以运用到各种Web Parts里面,成为共享的数据之一。




对于实体的描述,在BDC里面实际上是通过xml语言来进行的。




每一个实体,里面可以包含诸多东西,具体的大家可以看sdk里面的那张实体描述的图。在entity节里面大家可以发现method,identifier,property等节,他们都描述了实体是一个什么样的,即实体的方法,类型等。这里我只能粗略的说下我的一些经验,对于每一个方法群,实体必须要有一个方法的实例:即MethodInstance,只有这样实体才能调用方法的实例来获取数据。同样在方法里面可以定义你自己的数据筛选器,描述节为FilterDescription。利用BDC可以采用两种方式来获取数据,一种是采用web Service,一种是采用传统的ADO。在LobSystem里面提供两种配置,一个是采用WebServiceProxyNamespace,一个是采用RdbConnection。分别对应web Service和ado。这里不得不说一下,在moss里面的web service是托管的,所以在moss里面部署的Web Service必须采用特殊的格式。即:wsdl,disco文件必须做相应的更改。详细的一些步骤这里就不再说明,sdk里面有详细的部署方法。




每一个entity来说,必须有相应的方法名,数据名称,变量的描述,自定义类型的描述必须引入相应的类型。所有的parameter 的描述都是通过TypeDescriptor节来描述的,并且这些描述节可以嵌套。这样无论多复杂的parameter都可以被嵌套按层次描述出来。对于描述出来的方法,必须有相应的methodInstance,一个method可以有多个instance,但不能没有。




先说RdbConnection这种方式,也就是采用LobSystem里面自带的ADO引擎,首先我们必须定义采用引擎的数据提供类型,数据库类型,数据库名字等一系列的属性的定义,这些定义是在LobSystemInstance节里面描述的,其实这样做起来十分像java里面配置Hibernate里面的ORM后台数据库的配置节,其实这一套体系还是和java十分类似,由于看不到源代码,但是采用的设计模式应该差不多,同样也有连接池来维护一定数量的连接。对于数据的读取,这一块采用的主要是这两个接口,一个是IDataReader,IDataRecord,对于Entity的存放,采用的接口是IEntityInstanceEnumeator,IEntityInstance。前面二个接口是用来和数据库交互的,后面两个接口是用来和Entity交互的。对于后面两个接口,明眼人一下就可以看出来,一个是多条记录的枚举器,一个是单条记录。Sdk上面有几个画的很漂亮的图,因为我这里图片不好上传,传了还容易失效,所以就不贴图了(偷懒!!)。




再来说web service,在BDC里面可以直接调用web service来创建自己的实体方法,我们所需要做的,只是在实体描述文件里面描述相应的web Service方法就可以了。这样我们就可以导入自己的实体,并且实体的数据是从网络上获得的。SDK有一个亚马逊的调用Web Service的例子,我没有做通,因为登陆采用的是pass through方式,那个代理服务器的地址一直没找到(如果有知道的,希望告知,万分感激!!!)。个人只是自己写一个调本地数据库web Service,然后自己写了一个entity的描述文件导入到了里面。这里有二个值得注意的地方,一个是对于Web Service在moss里面的部署,一个是添加到web parts里面显示,对于数据库权限的控制。第一个问题只要细心的一般都可以搞定,部署在_layouts里面的Web Service通过moss托管,配置文件需要做相应的更改,实际上就是把soap里面的搜索地址更改了一下,具体的是这样改的:




<?xml version="1.0" encoding="utf-8"?>




这个描叙需要改为:




<%@ Page Language="C#" Inherits="System.Web.UI.Page" %>




<%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>




<%@ Import Namespace="Microsoft.SharePoint.Utilities" %>




<%@ Import Namespace="Microsoft.SharePoint" %>




<% Response.ContentType = "text/xml"; %>




实际上就是把原来的纯xml变换成为一个page来解析。并且这个页面的解析是通过moss处理的,




<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request) + "?wsdl"),Response.Output); %>

<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> 



对于contractRef 还有soap address这两个节的更改,需要改成上面的方式,实际上是在页面里面重新编码了soap的查询url,这样做的目的也是为了moss托管的web service可以正确定位。具体里面详细的机制我还不是摸得很清楚,因为本身对soap协议没有什么深刻的学习,希望还有达人指教。




 




如果你的BDC实体描述文件里面WebServiceProxyNamespace是写的自己虚机的地址,也就是说你调用的web service方法是部署在自己的虚机上面的,那么你就可以不需要上面的步骤就可以正常导入运行。但是这样做有一个非常麻烦的地方,运行的时候必须开虚机,要不然web Service是无法调用到的。对于数据库的权限问题,必须在数据库里面添加相应用户的权限,我用的是sql2005,这里应该在sql里面添加我当前域的可以访问moss用户的,对数据库读取的权限。具体的大家参看sql2005的配置,如何添加相应角色。对于部署在虚机上面的web service,也需要在数据库里面添加用户,NT AUTHORITY/NETWORK SERVICE,这样moss才能调用web service方法来访问数据库。Moss的权限这块做的很复杂,结合了ad,rmi这些东西偶都涉猎不深,还有待学习。




以上只是自己一些凌乱的心得和经历,很多东西都没有理解的很透彻,就像一个刚入门的孩子,站在wss的门口,看着这座大楼复杂的构架,众多新鲜的事务。很多东西都还需要学习。在这里希望和大家一起交流,一同进步。

posted on 2009-11-15 16:47  雷明  阅读(616)  评论(0编辑  收藏  举报