我们正在尝试部署Business Connectivity Services(BCS)模型解决方案,其中模型中的属性取决于Web服务公开的数据结构。
理想情况下,BCS模型会公开一组键/值对,然后转换为共享点列表中的列,因为这意味着相同的模型可以用于几个不同的数据集,但是我们可以告诉它不是BCS模型的设计方式,因为它们依赖于强模型模型以反映导入的实体。
因此,我们正在寻找一种解决方案,通过sharepoint中央管理员中的自定义页面将URL提供给远程数据集,用户可以“创建”新的外部列表,然后自动构建BCS模型项目(通过更改项目模板),然后动态编译和释放生成的功能。
这样我们就可以创建“fixed”类,其中的属性表示正在导入的数据的结构。
例如,数据源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模型“发票”,其中包含一个公共财产金额。
感谢任何人对这种方法的反馈或实现这一目标的“最佳实践”方式。
答案 0 :(得分:1)
[我在.Net做过类似的经历 - 我不确定这对你有多重要。]
我必须编写一个可以处理任何文件格式的导入工具。为了正确处理这个问题,我编写了一个小类,它将采用xml格式定义(名称,数据类型,格式字符串,自定义解析器等)并生成一个可以读取文件并公开IQueryable<FileFormat>
的类。和一些额外的元数据。
值得注意的是,为了使其完全灵活,我必须允许格式定义提供将被编译和执行的C#/ VB lambda(例如,当输入日期格式是非标准的并且需要自定义解析器时)。这显然是一个安全风险 - 所以当我实例化动态类时,我是在一个单独的AppDomain中完成的,只有很少的特权。这可能不适用于您的情况。
我们使用自定义模板引擎生成代码,然后使用System.Codedom.Compiler命名空间编译 - 这允许我们创建程序集并缓存它们,直到更改定义。如果你做类似的事情,可能值得考虑Razor模板引擎。
我们从针对未知数据类型的编码中产生的唯一真正问题。通过使自定义类实现我们自己的IImportFile
接口,该接口以标准方式公开元数据(实际上与xml规范中的信息相同),我们可以毫不费力地解决它。
我们很幸运,这是受信任用户的工具(至少只有受信任的用户可以提供新的文件格式规范),因此安全风险有限。如果您正在根据用户输入编译代码,请确保您已获得足够的安全措施。