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 模型,它具有两个公共属性 color 和 make 但是数据源 B 可以公开

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

在这种情况下,我们需要一个 BCS 模型“发票”,其中包含单个公共属性的金额。

感谢任何人对此方法或实现此目标的“最佳实践”方式的反馈。

4

1 回答 1

1

[我在 .Net 中做过类似的事情——我不确定这对你有多大的意义。]

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

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

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

我们遇到的唯一真正问题是针对未知数据类型进行编码。通过使自定义类实现我们自己的IImportFile接口,该接口以标准方式公开元数据(实际上与 xml 规范中的信息相同),我们可以轻松解决它。

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

于 2012-02-12T00:58:44.480 回答