当前位置: 首页>>技术问答>>正文


SharePoint 2013 CSOM:传递Context对象或Url更好吗?

webfans 技术问答 , , 去评论

问题描述

在SharePoint 2013 CSOM中,最好是传递Context对象,还是使用Url来打开上下文?

这将是最好的例子:(请考虑可能有很多方法预先形成任务)

1)通过Context,打开Web

EnableSomethingOnWeb(ClientContext ctx, bool enable){
   ctx.Load(ctx.Web);
   // enable something
   ctx.ExecuteQuery();
}

var ctx = new ClientContext("http://myweb");
EnableSomethingOnWeb(ctx, true);

2)传递URL,打开ClientContext,打开网页

EnableSomethingOnWeb(string Url, bool enable){
   var ctx = new ClientContext(Url);
   ctx.Load(ctx.Web);
   // enable something
   ctx.ExecuteQuery();
}

EnableSomethingOnWeb(webUrl, true);

3)传递Web,执行ClientContext

EnableSomethingOnWeb(Web web, bool enable){

   // enable something
   web.Context.ExecuteQuery();
}

var ctx = new ClientContext("http://myweb");
ctx.Load(ctx.Web);

EnableSomethingOnWeb(ctx.Web, true);
*keep in mind following calls may continue pass this web object around.

最佳解决方案

做:

  • 绕过ClientContext

  • 尽可能少地调用.ExecuteQuery(),使用.Load()进行捆绑/批处理。

    • 一旦通常足够,只有极少数情况下你需要更多。

不要:

  • 不要绕过Web

    • 您需要引用ClientContext中的其他成员,例如Site

  • 不要传递URL(StringUri)。

    • ClientContext的初始化方法可以替代,例如,提供商托管的应用程序使用此:SharePointContextProvider.Current.GetSharePointContext(HttpContext).CreateUserC‌​lientContextForSPHost()

另外:我通常制作”Repository”类,它们在ClientContext上工作而不实际调用.ExecuteQuery(),所以我捆绑(批处理).Load命令并在”outside”上触发它们,然后返回到存储库。

public class ListAndViewRepository
{
    private readonly ListCollection _lists;
    public List<List> Lists { get; set; }
    public List<View> Views { get; set; }

    public ListAndViewRepository(ClientContext clientContext)
    {
        _lists = clientContext.Web.Lists;
        clientContext.Load(_lists,
            collection =>
                collection.Include(l => l.Id, l => l.Title,
                    l => l.Views.Include(v => v.Id, v => v.Title, v => v.ViewFields, v => v.ViewQuery)));
    }

    public void Execute()
    {
        Lists = _lists.ToList();
        Views = Lists.SelectMany(list => list.Views.ToList()).ToList();
    }
}

使用这样的东西:

var listAndViewRepository = new ListAndViewRepository(clientContext);
// ... do a lot of other "repositories"
clientContext.ExecuteQuery();
// ... call "Execute" on other "repositories"
listAndViewRepository .Execute();
var lists = listAndViewRepository.Lists;
var views = listAndViewRepository.Views; 

次佳解决方案

WebClientContext这样的对象通过引用传递,即它们不被复制。所以没有必要担心性​​能。但是,正如@eirikb所提到的,在方法之间使用ClientContext更有意义,因为您可以在方法中加载您想要的任何对象。

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2657.html,转载请务必附带本地址声明。