我们正在尝试部署一个业务连接服务(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>
在这种情况下,我们需要一张BCS模型的"发票",其中包含一个公共财产的金额。
感谢任何人对这种方法或实现这一目标的"最佳实践"方式的反馈。
[我在.Net中做过类似的事情,我不确定这对你有多重要。]
我必须编写一个可以处理任何文件格式的导入工具。为了正确处理这个问题,我编写了一个小类,它将采用xml格式定义(名称、数据类型、格式字符串、自定义解析器等),并生成一个类,该类可以读取文件并公开IQueryable<FileFormat>
和一些额外的元数据。
值得注意的是,为了使其完全灵活,我必须允许格式定义提供一个C#/VB lambda,它将被编译和执行(例如,当输入日期格式是非标准的,需要自定义解析器时)。这显然是一个安全风险,所以当我实例化动态类时,我是在一个单独的AppDomain中实例化的,权限很少。这可能不适用于您的情况。
我们使用自定义模板引擎生成代码,然后使用System.Codedom.Compiler命名空间进行编译。这使我们能够创建程序集并缓存它们,直到定义更改为止。如果你做了类似的事情,也许值得考虑Razor模板引擎。
我们遇到的唯一真正的问题是针对未知数据类型进行编码。通过让自定义类实现我们自己的IImportFile
接口,该接口以标准方式公开元数据(实际上与xml规范中的信息相同),我们可以在不付出太多努力的情况下解决它。
我们很幸运,因为这是一个适用于受信任用户的工具(至少只有受信任的用户才能提供新的文件格式规范),因此安全风险有限。如果您是根据用户输入编译代码,请确保您有足够的保护措施。