此数据访问模式在SharePoint中是否可接受?

时间:2012-08-14 16:21:32

标签: sharepoint design-patterns sharepoint-2010 caml

我正在创建一个SharePoint应用程序,并且希望尽可能经常地以正确的方式执行操作。

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

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

我想避免滥用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 个答案:

答案 0 :(得分:1)

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

使用ElevatePriveleges时,有时当您拥有广泛使用的数据访问代码时,如果您不希望直接在SharePoint UI中授予他们对列表的访问权限,则很多时候您必须提升权限,但希望在其上下文中执行代码访问用户控件等的列表项。

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

希望这会有所帮助