Last time we took a quick look into MvcMiniProfiler, how to get it up and running on EPiServer and the basics of profiling code.
This time, we'll take a look at the DataFactory and profiling it's use.
ProfiledDataFactory
A lot of the time, when you're not working with the CurrentPage PageData object, you're working with the EPiServer DataFactory to obtain and manipulate PageData objects. ProfiledDataFactory is a simple wrapper around the default DataFactory; I've implemented all the methods which aren't marked with the Obsolete attribute so the class is a drop-in replacement for EPiServer.DataFactory. As a side note, if EPiServer employed Dependency Injection or was more losely coupled, we might have been able to replace the default DataFactory throughout the framework. (double click the code to select it as plain text)
using System.Collections.Generic;
using EPiServer.Configuration;
using EPiServer.Core;
using EPiServer.DataAbstraction;
using EPiServer.DataAccess;
using EPiServer.Security;
using MvcProf = MvcMiniProfiler;
namespace EPiServer.MiniProfiler
{
public sealed class ProfiledDataFactory
{
private static ProfiledDataFactory _instance = new ProfiledDataFactory();
public static ProfiledDataFactory Instance
{
get { return _instance; }
}
public PageReference Copy(PageReference pageLink, PageReference destinationLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory Copy"))
return DataFactory.Instance.Copy(pageLink, destinationLink);
}
public PageReference Copy(PageReference pageLink, PageReference destinationLink, bool allowThreading)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory Copy"))
return DataFactory.Instance.Copy(pageLink, destinationLink, allowThreading);
}
public PageReference Copy(PageReference pageLink, PageReference destinationLink, bool publishOnDestination, bool allowThreading)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory Copy"))
return DataFactory.Instance.Copy(pageLink, destinationLink, publishOnDestination, allowThreading);
}
public PageReference Copy(PageReference pageLink, PageReference destinationLink, AccessLevel requiredSourceAccess, AccessLevel requiredDestinationAccess, bool publishOnDestination, bool allowThreading)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory Copy"))
return DataFactory.Instance.Copy(pageLink, destinationLink, requiredSourceAccess, requiredDestinationAccess, publishOnDestination, allowThreading);
}
public PageData CreateLanguageBranch(PageReference pageLink, ILanguageSelector selector)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory CreateLanguageBranch"))
return DataFactory.Instance.CreateLanguageBranch(pageLink, selector);
}
public PageData CreateLanguageBranch(PageReference pageLink, ILanguageSelector selector, AccessLevel access)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory CreateLanguageBranch"))
return DataFactory.Instance.CreateLanguageBranch(pageLink, selector, access);
}
public void Delete(PageReference pageLink, bool forceDelete)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory Delete"))
DataFactory.Instance.Delete(pageLink, forceDelete);
}
public void Delete(PageReference pageLink, bool forceDelete, AccessLevel access)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory Delete"))
DataFactory.Instance.Delete(pageLink, forceDelete, access);
}
public void DeleteChildren(PageReference pageLink, bool forceDelete)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory DeleteChildren"))
DataFactory.Instance.DeleteChildren(pageLink, forceDelete);
}
public void DeleteChildren(PageReference pageLink, bool forceDelete, AccessLevel access)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory DeleteChildren"))
DataFactory.Instance.DeleteChildren(pageLink, forceDelete, access);
}
public void DeleteLanguageBranch(PageReference pageLink, string languageBranch)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory DeleteLanguageBranch"))
DataFactory.Instance.DeleteLanguageBranch(pageLink, languageBranch);
}
public void DeleteLanguageBranch(PageReference pageLink, string languageBranch, AccessLevel access)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory DeleteLanguageBranch"))
DataFactory.Instance.DeleteLanguageBranch(pageLink, languageBranch, access);
}
public void DeleteVersion(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory DeleteVersion"))
DataFactory.Instance.DeleteVersion(pageLink);
}
public void DeleteVersion(PageReference pageLink, AccessLevel access)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory DeleteVersion"))
DataFactory.Instance.DeleteVersion(pageLink, access);
}
public PageDataCollection FindAllPagesWithCriteria(PageReference pageLink, PropertyCriteriaCollection criterias, string languageBranch, ILanguageSelector selector)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory FindAllPagesWithCriteria"))
return DataFactory.Instance.FindAllPagesWithCriteria(pageLink, criterias, languageBranch, selector);
}
public PageDataCollection FindPagesWithCriteria(PageReference pageLink, PropertyCriteriaCollection criterias)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory FindPagesWithCriteria"))
return DataFactory.Instance.FindPagesWithCriteria(pageLink, criterias);
}
public PageDataCollection FindPagesWithCriteria(PageReference pageLink, PropertyCriteriaCollection criterias, string languageBranch)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory FindPagesWithCriteria"))
return DataFactory.Instance.FindPagesWithCriteria(pageLink, criterias, languageBranch);
}
public PageDataCollection FindPagesWithCriteria(PageReference pageLink, PropertyCriteriaCollection criterias, string languageBranch, ILanguageSelector selector)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory FindPagesWithCriteria"))
return DataFactory.Instance.FindPagesWithCriteria(pageLink, criterias, languageBranch, selector);
}
public PageDataCollection GetChildren(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetChildren"))
return DataFactory.Instance.GetChildren(pageLink);
}
public PageDataCollection GetChildren(PageReference pageLink, ILanguageSelector selector)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetChildren"))
return DataFactory.Instance.GetChildren(pageLink, selector);
}
public PageDataCollection GetChildren(PageReference pageLink, ILanguageSelector selector, int startIndex, int maxRows)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetChildren"))
return DataFactory.Instance.GetChildren(pageLink, selector, startIndex, maxRows);
}
public PageData GetDefaultPageData(PageReference parentPageLink, int pageTypeID)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetDefaultPageData"))
return DataFactory.Instance.GetDefaultPageData(parentPageLink, pageTypeID);
}
public PageData GetDefaultPageData(PageReference parentPageLink, string pageTypeName)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetDefaultPageData"))
return DataFactory.Instance.GetDefaultPageData(parentPageLink, pageTypeName);
}
public PageData GetDefaultPageData(PageReference parentPageLink, int pageTypeID, ILanguageSelector selector)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetDefaultPageData"))
return DataFactory.Instance.GetDefaultPageData(parentPageLink, pageTypeID, selector);
}
public PageData GetDefaultPageData(PageReference parentPageLink, string pageTypeName, ILanguageSelector selector)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetDefaultPageData"))
return DataFactory.Instance.GetDefaultPageData(parentPageLink, pageTypeName, selector);
}
public IList<PageReference> GetDescendents(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetDescendents"))
return DataFactory.Instance.GetDescendents(pageLink);
}
public PageDataCollection GetLanguageBranches(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetLanguageBranches"))
return DataFactory.Instance.GetLanguageBranches(pageLink);
}
public PageReferenceCollection GetLinksToPages(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetLinksToPages"))
return DataFactory.Instance.GetLinksToPages(pageLink);
}
public PageData GetPage(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetPage"))
return DataFactory.Instance.GetPage(pageLink);
}
public PageData GetPage(PageReference pageLink, ILanguageSelector selector)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetPage"))
return DataFactory.Instance.GetPage(pageLink, selector);
}
public PageProviderBase GetPageProvider(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetPageProvider"))
return DataFactory.Instance.GetPageProvider(pageLink);
}
public PageProviderBase GetPageProvider(string remoteSiteName)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetPageProvider"))
return DataFactory.Instance.GetPageProvider(remoteSiteName);
}
public PageDataCollection GetPages(IList<PageReference> pageLinks, ILanguageSelector selector)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetPages"))
return DataFactory.Instance.GetPages(pageLinks, selector);
}
public PagePath GetParents(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetParents"))
return DataFactory.Instance.GetParents(pageLink);
}
public Settings GetSettingsFromPage(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetSettingsFromPage"))
return DataFactory.Instance.GetSettingsFromPage(pageLink);
}
public Settings GetSettingsFromPage(PageReference pageLink, bool fallbackToStartPageId)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory GetSettingsFromPage"))
return DataFactory.Instance.GetSettingsFromPage(pageLink, fallbackToStartPageId);
}
public bool IsCapabilitySupported(PageReference pageLink, PageProviderCapabilities capability)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory IsCapabilitySupported"))
return DataFactory.Instance.IsCapabilitySupported(pageLink, capability);
}
public bool IsWastebasket(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory IsWastebasket"))
return DataFactory.Instance.IsWastebasket(pageLink);
}
public PageDataCollection ListDelayedPublish()
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory ListDelayedPublish"))
return DataFactory.Instance.ListDelayedPublish();
}
public PageVersionCollection ListPublishedVersions(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory ListPublishedVersions"))
return DataFactory.Instance.ListPublishedVersions(pageLink);
}
public PageVersionCollection ListVersions(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory ListVersions"))
return DataFactory.Instance.ListVersions(pageLink);
}
public PageVersionCollection ListVersions(PageReference pageLink, string languageBranch)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory ListVersions"))
return DataFactory.Instance.ListVersions(pageLink, languageBranch);
}
public PageVersion LoadPublishedVersion(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory LoadPublishedVersion"))
return DataFactory.Instance.LoadPublishedVersion(pageLink);
}
public PageVersion LoadPublishedVersion(PageReference pageLink, string languageBranch)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory LoadPublishedVersion"))
return DataFactory.Instance.LoadPublishedVersion(pageLink, languageBranch);
}
public PageVersion LoadVersion(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory LoadVersion"))
return DataFactory.Instance.LoadVersion(pageLink);
}
public void Move(PageReference pageLink, PageReference destinationLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory Move"))
DataFactory.Instance.Move(pageLink, destinationLink);
}
public void Move(PageReference pageLink, PageReference destinationLink, AccessLevel requiredSourceAccess, AccessLevel requiredDestinationAccess)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory Move"))
DataFactory.Instance.Move(pageLink, destinationLink, requiredSourceAccess, requiredDestinationAccess);
}
public void MoveToWastebasket(PageReference pageLink)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory MoveToWastebasket"))
DataFactory.Instance.MoveToWastebasket(pageLink);
}
public void ResetCounters()
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory ResetCounters"))
DataFactory.Instance.ResetCounters();
}
public PageReference ResolvePageFolder(int pageFolderId)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory ResolvePageFolder"))
return DataFactory.Instance.ResolvePageFolder(pageFolderId);
}
public PageReference Save(PageData page, SaveAction action)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory Save"))
return DataFactory.Instance.Save(page, action);
}
public PageReference Save(PageData page, SaveAction action, AccessLevel access)
{
using (MvcProf.MiniProfiler.StepStatic("ProfiledDataFactory Save"))
return DataFactory.Instance.Save(page, action, access);
}
}
}
All we need to do now is replace and calls to DataFactory.Instance with ProfiledDataFactory.Instance.
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
NewsItems.DataSource = ProfiledDataFactory.Instance.GetChildren(CurrentPageLink);
NewsItems.DataBind();
}
This will give us profile information like so:

Caveat
A lot of the DataFactory methods such as GetPage are duplicated within the PageBase class. These methods simply wrap calls to DataFactory.Instance.GetPage and the like. If you use these methods, they won't provide any profile information because they're not using the ProfiledDataFactory. As I mentioned earlier, if EPiServer allowed us to replace DataFactory.Instance with anything that implements an IDataFactory interface or an object which inherited from PageStoreBase, we'd be able to plug this ProfiledDataStore in throughout our EPiServer application.
Next Time
In the next post, we'll explore replacing some of the EPiServer base classes for pages and user controls to get some basic profiling infrastructure within your application.