2012-02-03 43 views
4

我们试图部署业务连接服务(BCS)模型解决方案,其中模型中的属性取决于Web服务公开的数据结构。如何动态生成业务连接服务

理想情况下,BCS模型会公开一个键/值对的集合,然后将其转换为分享点列表中的列,因为这意味着相同的模型可以用于多个不同的数据集,但是从我们可以告诉的这不是如何设计BCS模型的,因为它们依赖模型进行强类型化以反映正在导入的实体。

因此,我们正在寻找一种解决方案,使用户能够通过在远程数据集中通过sharepoint中央管理中的自定义页面提供url来“创建”一个新的外部列表,然后将自动构建BCS模型项目(通过更改项目模板),然后编译和释放生成的功能。

通过这种方式,我们可以创建具有代表所导入数据结构的属性的“固定”类。

例如,数据源A可以暴露

<cars> 
<car> 
<color>blue</color> 
<make>ford</make> 
</car> 
<car> 
<color>red</color> 
<make>lotus</make> 
</car> 
</cars> 

在这种情况下,我们需要一个BCS模型有两个公共属性,颜色“汽车”,并 但是数据源B可以暴露

<invoices> 
<invoice> 
<amount>£34.00</amount> 
</invoice> 
<invoice> 
<amount>£34.00</amount> 
</invoice> 
</invoices> 

在这种情况下,我们需要一个带有单个公共财产的BC​​S模型“发票”。

希望任何人对此方法或实现此“最佳实践”方式的反馈意见。

回答

1

[我已经有经验做类似的事情在.net - 我不知道这将是你如何相关的。]

我不得不写的导入工具,可以处理任何文件格式。为了正确处理这个问题,我编写了一个小类,它将采用xml格式定义(名称,数据类型,格式字符串,自定义解析器等),并生成一个可以读取该文件并公开一个IQueryable<FileFormat>和一些额外的元数据。

值得注意的是,为了使其完全灵活,我不得不允许格式定义提供一个C#/ VB lambda,它将被编译和执行(例如,当输入日期格式非标准且需要定制解析器)。这显然是一种安全风险 - 所以当我实例化动态类时,我在一个独立的AppDomain中做了很少的特权。这可能不适用于您的情况。

我们使用自定义模板引擎生成代码,然后使用System.Codedom.Compiler命名空间编译代码 - 这允许我们创建程序集并缓存它们,直到定义更改。如果你做类似的事情,可能值得考虑Razor模板引擎。

我们从编码未知数据类型中产生的唯一真正的问题。通过使定制类实现我们自己的IImportFile以标准方式公开元数据的界面(实际上与xml规范中的信息相同),我们可以在不费力的情况下解决它。

我们很幸运,这是一个值得信赖的用户使用的工具(至少只有受信任的用户可以提供新的文件格式规范),所以安全风险是有限的。如果您正在根据用户输入编译代码,请确保您有足够的安全措施。