遵循SharePoint列表的存储库模式

本文关键字:模式 存储 SharePoint 列表 遵循 | 更新日期: 2023-09-27 17:51:20

我正在使用SharePoint列表的存储库模式(而不是直接访问数据库中的实际表)在列表项的集合上创建一个类。我所见过的存储库模式设计不断地为每个单独的存储库创建一个新的上下文,但是我希望对可能存在的每个并发存储库(每个列表一个)使用相同的ClientContext对象。假设我不希望某人必须自己创建一个新的ClientContext实例,该实例将作为构造函数传递到SPRepository类中,那么我还有什么其他选项可以将其保存在静态内存中?

引用:

https://msdn.microsoft.com/en-us/library/ff649690.aspxhttps://hendrikbulens.wordpress.com/2014/12/14/repository-pattern-sharepoint/(这个为每个列表使用单独的存储库,而我想做一个更通用的,在构造函数中接受列表名称的存储库)

遵循SharePoint列表的存储库模式

这是一个比看起来更复杂的主题,因为有很多事情需要考虑。我见过的大多数解决方案(包括您的链接)都试图以性能和资源消耗为代价使代码通用。没有放之四海而皆准的办法。

单一职责

您应该将ClientContext注入到您的存储库中,因为CSOM有许多不同的认证场景(NTLM, FBA, ADFS,具有用户身份的高信任应用程序,具有应用程序身份的高信任应用程序,仅举几例)。存储库不应该知道身份验证方法和创建上下文的方法。

资源

在希望避免创建不必要对象的简单场景中,在多个存储库之间共享一个ClientContext实例可能是一个好主意。它实现了IDisposable,我们应该假设这是有原因的。

ExecuteQuery()呼叫数

如果你为多个存储库使用一个ClientContext实例,你可以调度多个操作,并通过一个请求来执行它们。

var result1 = repository1.ScheduleLoad();
var result2 = repository2.ScheduleLoad();
context.ExecuteQuery();

记住CSOM是远程API。调用的次数和检索的数据量将对性能产生重大影响。

从其他对象或线程调用ExecuteQuery()

考虑一下:

var web = StaticClass.Context.Web;
var list = web.GetList('Lists/example');
var item = list.GetItemById(1);
item["Title"] = "Test";
var result = repository.GetItemsAndExecute();
//or some other thread calls StaticClass.Context.ExecuteQuery();
item.Update();
StaticClass.Context.ExecuteQuery();

结果是什么?Title字段的值保持为空。原因:

  • 第一次调用通过id获取项目并设置字段值,但不调用Update()
  • 第二次调用再次通过id 获取项目,并调用Update(),但不设置字段值。