【问题标题】:Adhering to a Repository Pattern for a SharePoint list遵循 SharePoint 列表的存储库模式
【发布时间】:2016-06-25 16:59:01
【问题描述】:

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

参考资料:

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

【问题讨论】:

    标签: c# sharepoint sharepoint-2013 repository-pattern


    【解决方案1】:

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

    单一责任

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

    资源

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

    ExecuteQuery() 调用次数

    如果您将一个 ClientContext 实例用于多个存储库,您可以安排多个操作并通过一个对 SharePoint 的请求来执行所有操作。

    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()
    • 第二次调用再次获取项目并调用Update(),但未设置字段值。

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多