WithWeb-pattern of Jonas Nilsson
Anatoly Mironov
Jonas Nilsson shows an interesting approach for working with SPSite and SPWeb which must be disposed. Create a helper method WithWeb and send an Action parameter:
public void WithWeb(string uri, Action<SPWeb> action)
{
using (SPSite site = new SPSite(uri))
{
using (SPWeb web = site.OpenWeb())
{
action(web);
}
}
}Here is my implementation of this pattern:
public static class DisposalService
{
public static void WithWeb(string uri, Action<SPWeb> action)
{
using (var site = new SPSite(uri))
{
using (var web = site.OpenWeb())
{
web.UnsafeUpdate(action);
}
}
}
public static void WithElevatedWeb(string uri, Action<SPWeb> action)
{
SPSecurity.RunWithElevatedPrivileges(() => WithWeb(uri, action));
}
}Here I use another fancy way to consolidate the unsafe updates. I added an additional method: WithElevatedWeb, it creates the web as system account. And here comes an example of using this static method:
Action<SPWeb> update = (SPWeb w) =>
{
UserService.UpdateOwners(owners, w);
UserService.UpdateMembers(members, w);
};
DisposalService.WithWeb(SPContext.Current.Web.Url, update);