2012-08-14 45 views
1

我正在创建一个SharePoint应用程序,并希望尽可能经常以正确的方式执行操作。此数据访问模式在SharePoint中可以接受吗?

我在网站定义中部署了一系列列表,我想将数据访问锁定到一系列Get()方法来维护约定。

我的一些列表在列表定义中设置了SecurityBits =“22”,因为我希望仅在UI中修改List Item条目。

我想避免滥用SPSecurity.RunWithElevatedPrivileges。我也想避开SPSecurity.RunWithElevatedPrivileges的限制,你不能在代表中有return函数。

这似乎是一个强制执行此操作的好方法。如果您打电话给列表以获取具有正常安全性的列表项目,则可以致电var PostList = CoreLists.Posts。如果您需要使用提升的权限致电该列表,请拨打var PostList = CoreLists.SystemAccount.Posts

这是一个很好的方法吗?

public static class CoreLists 
{ 
    public static SPList Posts() 
    { 
     return SPContext.Current.Web.GetList(SPContext.Current.Web.ServerRelativeUrl + "/lists/CommunityPost"); 
    } 
    public static class SystemAccount 
    { 
     public static SPList Posts() 
     { 
      using (var elevatedSite = new SPSite(SPContext.Current.Site.ID, SPContext.Current.Site.SystemAccount.UserToken)) 
      using (var web = elevatedSite.OpenWeb()) 
       return web.GetList(web.ServerRelativeUrl + "/lists/CommunityPost"); 
     } 
    } 
} 

回答

1

我认为只要您的安全上下文有意义(即安全性最低的用户可以使用这些方法访问列表项),第一类看起来很好。我会好奇第二个中的using语句如何影响代码的调用。

ElevatePriveleges的事情是,有时当您有广泛使用的数据访问代码时,如果您不想让他们直接在SharePoint用户界面中访问列表,您必须提升权限,但希望在其上下文中执行代码访问用户控件等的列表项。

有几件事要记住: 1.始终认识到使用SharePoint中的列表访问代码的内存泄漏。在您的课程中,您处理两种情况都很好,就处理任何SPRequest处置而言。 2.你几乎从不想在代码中使用SPList.Items。如果以这种方式列出清单并且您不管理调用清单的代码,则可能遇到大清单的性能问题,因为调用.Items属性而不是特定的查询,会为每个项目加载每个项目该清单。

希望这有助于

相关问题