2

我必须实现一个架构,不幸的是,我们使用 SharePoint 2013 作为我们的主要数据库。(不是我的选择,以防你没有选择)。我在服务器上有一个 Asp.Net MVC 外观应用程序,处理来自 SP 和其他几个数据源的数据组合,然后是一个 JavaScript SPA 作为客户端。另一个问题是客户端需要能够离线工作,所以我需要使用 IndexedDB 来存储数据以供离线访问。

这似乎是微风.js 的完美用例。我的基本架构是在 MVC 外观中定义一个强类型模型,它将包装我从 SP 获得的无类型数据(以 object [“property”] 形式 - 使用 SP 客户端对象模型)。Breeze 将处理此模型和客户端之间的同步,我将根据需要使用导出/导入功能在 IndexedDB 中缓存数据。

到现在为止还挺好。但是……微风站点上的 SOA 示例仍在开发中(对我来说,这基本上是一种 SOA 架构,每个 SP 列表都是一个要组合的服务)。我能找到的最接近的东西是NoDB示例,但它在客户端上硬编码元数据。我想在 MVC 模型中建立关系和验证,然后将它们传递给客户端,因此验证可以在两个地方运行相同的声明。

这可能吗?如果是这样 - 如何?如果没有,是否有人有解决方法或更好的主意?我已经习惯于在两个不同的地方定义模型(外观和隐含的 SP 列表的结构)。我非常希望避免在客户端中第三次实施它。我愿意让微风.js 直接与 SP REST 端点对话,但我从https://stackoverflow.com/a/15364503/1014822的理解是该实现存在缺陷并且没有公开所需的元数据。

解决方案:根据以下接受的答案,我得出以下解决方案:

1) 从 SP ListData.svc 端点生成服务引用 - 从而创建 edmx 和代理类。

BuildJsonMetadata2)在我的存储库中扩展 ContextProvider 并像这样覆盖:

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 非常有用的T4TS.tt模板脚本从服务代理类生成一个 d.ts,这样我就可以对微风加载的数据进行类型安全。

到目前为止,这个设置很好 - 我可以使用元数据执行基本的 CRUD,由 SP 作为数据源支持。

4

1 回答 1

3

v 1.2.7开始,我们已经记录了 Breeze 的元数据模式,并且从您的 web 服务返回的遵循此模式的 json 对象现在将被 Breeze 接受。

--- 之前的帖子在下面

我们将在接下来的一周左右记录如何公开任意服务器端元数据,随后不久将提供一些如何使用任意 Web 服务的示例。还涉及一些小的代码更改。

目前,在这些文档完成之前,最好的解决方法是在客户端上创建元数据并使用 jsonResultsAdapter 将服务调用的结果塑造成“实体”。您在客户端创建的元数据将与您最终在服务器上创建并发送到客户端的元数据完全相同。

希望这可以帮助。

于 2013-03-19T17:21:36.083 回答