c# - 将 Disposable 与 SharePoint 对象(Web 部件)结合使用

标签 c# sharepoint

在 SharePoint 中编写 Web 部件时,您是否通过 using 子句实现 IDisposable?或者,您是否在 try/catch/finally 中处理您的对象?两个都?依靠?你为什么选择其中一个而不是另一个?

背景:

我正在编写一些未实现 IDisposable 的继承代码,因此我一直在阅读以纠正问题。 MSDN 有一篇很好的文章介绍了“最佳实践”:

http://msdn.microsoft.com/en-us/library/aa973248.aspx

建议using,但接着又说,在许多情况下,不建议使用using

最佳答案

我能理解文章中的含糊之处 - 真正的答案是清晰如泥:)

当涉及到 Web 部件开发(或一般使用 SharePoint API 进行开发)时,如果您没有正确实例化对象,则处理某些对象(特别是 SPOM 对象)将产生不可预测的结果。

特别是,如果您从当前上下文获取对 SPSite 或 SPWeb 的对象引用并尝试处置它(使用 using 子句或 try/finally),您将从 SharePoint 堆栈中收到对象引用错误.

处理 SP 对象(SPSite、SPWeb 等)的正确方法是从使用 URL 的站点实例化一个新的 SP 对象(而不是使用上下文来获取它)。例如:

using (SPSite siteCollection = new SPSite("http://your_site_url"))
{
  using (SPWeb site = siteCollection.OpenWeb("News"))
  {
    //do stuff with your news web
  }
}

下面是一个代码示例,如果您尝试使用它,则会抛出对象引用错误:

using(contextSite = SPControl.GetContextSite(Context))
{
  using (SPWeb site = siteCollection.OpenWeb("News"))
  {
    //do stuff with your news web
  }
}

该错误不会在 using block 期间发生,但稍后当 SharePoint 尝试在网站内部执行某些操作时,就会在下游发生。

就一般用途而言,如果您有 IDisposable 对象,我非常喜欢使用()而不是 try/finally。我选择 try/finally 的唯一一次是如果我需要围绕取消分配非 IDisposable 对象执行额外的逻辑。

希望这有帮助!

关于c# - 将 Disposable 与 SharePoint 对象(Web 部件)结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/820577/

相关文章:

c# - 这是使用模拟对存储库进行单元测试的正确方法吗?

css - 将图像添加到共享点主题

javascript - 如何在我们编写 javascript 的脚本编辑器中的 SharePoint 中进行调试?

c# - 如何使用 Web 服务获取 SharePoint 列表中新插入行的 ID

excel - 如何使用 VBA 或 Powershell 将列表从具有 NTLM 身份验证的 Sharepoint 服务器导出到 Excel

c# - 向界面添加新功能

c# - 如何通过对象的属性从自定义对象列表中删除重复项

C# 线程安全(特别是 MVVM/WPF)

c# - 调用 HTTPClient.PostAsync 时设置授权/内容类型 header

r - 如何使用 Iframe 标记在 SharePoint 上嵌入 Shiny 的应用程序