我必须实现一个架构,不幸的是,我们实际上使用 SharePoint 2013 作为我们的主要数据库。 (这不是我的选择,以防你没有注意到)。我在服务器上有一个 Asp.Net MVC 外观应用程序,处理来自 SP 和其他几个数据源的数据组合,然后有一个 JavaScript SPA 作为客户端。另一个问题是客户端需要能够离线工作,因此我需要使用 IndexedDB 来存储数据以供离线访问。
这似乎是breeze.js 的完美用例。我的基本架构是在 MVC 外观中定义一个强类型模型,它将包装我从 SP 获得的非类型数据(以对象[“属性”] 的形式 - 使用 SP 客户端对象模型)。 Breeze 将处理该模型和客户端之间的同步,我将根据需要使用导出/导入功能在 IndexedDB 中缓存数据。
到目前为止,一切都很好。但是……breeze 站点上的 SOA 示例仍在开发中(对我来说,这从根本上来说是一个 SOA 架构,每个 SP 列出一个要组成的服务)。我能找到的最接近的是NoDB http://www.breezejs.com/samples/nodb示例,但这会在客户端上硬编码元数据。我想在 MVC 模型中建立关系和验证,然后将它们传递给客户端,以便验证可以在两个地方运行相同的声明。
这可能吗?如果是这样 - 怎么办?如果没有,有人有解决方法或更好的想法吗?我已经决定在两个不同的地方定义模型(外观和隐含的 SP 列表的结构)。我非常希望避免在客户端中第三次实现它。我愿意让 Breeze.js 直接与 SP REST 端点对话,但我的理解是https://stackoverflow.com/a/15364503/1014822 https://stackoverflow.com/a/15364503/1014822是实现有缺陷并且没有公开所需的元数据。
解决:根据下面接受的答案,我得出以下解决方案:
1) 从 SP ListData.svc 端点生成服务引用 - 从而创建 edmx 和代理类。
2) 在我的存储库中扩展 ContextProvider 并覆盖BuildJsonMetadata
像这样:
protected override string BuildJsonMetadata()
{
XDocument xDoc = XDocument.Load(HttpContext.Current.Server.MapPath("PATH_TO_EDMX"));
String xString = xDoc.ToString();
xString = xString.Replace("DATA_SERVICE_NAMESPACE", "APP_NAMESPACE");
xDoc = XDocument.Parse(xString);
var jsonText = CsdlToJson(xDoc);
return jsonText;
}
3)稍微修改breeze.js,编辑第12383行:
var schema = metadata.schema || metadata["edmx:Edmx"]["edmx:DataServices"].schema;
(我大概也可以通过为我的 xDoc 选择后代而不是根节点来修复 ContextProvider 中的这个问题)
4) - 可选择使用@Christoff's非常有用T4TS.tt https://github.com/cskeppstedt/t4ts模板脚本从服务代理类生成 d.ts,这样我就可以对微风加载的数据进行类型安全。
到目前为止,此设置效果很好 - 我可以使用元数据执行基本的 CRUD,并由 SP 作为数据源支持。