Orchard CMS ContentManager BuildDisplay 非常慢
Orchard CMS ContentManager BuildDisplay very slow
我是 Orchard 的新手,但我觉得我正在取得重大进展。我一直致力于使我的显示驱动程序更高效,而构建显示似乎是最需要工作的领域。
当构建显示 30 个内容项时,以下代码大约需要 30 秒才能完成。我不知道还有什么其他方法可以为内容项构建显示形状或使其更快。
非常感谢您的反馈。
var contentItems = _profileService.GetProfileList(profileViewOptionsDetails.filteredServices, pageNumber, profileViewOptionsDetails.PageSize, queryString);
var pager = new Pager(_siteService.GetSiteSettings(), pageNumber, pageSize);
var pagerShape = shapeHelper.Pager(pager).TotalItemCount(totalItemCount);
var list = shapeHelper.List();
foreach (var contentItem in contentItems.ContentItems)
{
list.Add(_mcrfContentManager.BuildDisplay(contentItem.Content, "Summary"));
}
public FilterGroup GetProfileList(List<int> filterList, int page, int pageSize, string query)
{
IList<ProfileRoles> profileRecords = new List<ProfileRoles>();
FilterGroup filteredProfiles = new FilterGroup();
profileRecords = GetMcrfProfileList(filterList, query, page, pageSize);
filteredProfiles.ProfileCount = profileRecords.Count;
var content = GetMcrfProfileRecords(profileRecords.Select(item => item.ContentID).ToList());
IList<ProfileListEntity> profileList = new List<ProfileListEntity>();
foreach (var c in content)
{
ProfileListEntity profileListEntity = new ProfileListEntity();
profileListEntity.Content = c;
profileListEntity.Role = profileRecords.Where(x => x.ContentID == c.Id).Select(y => y.Role).ToList().First();
profileList.Add(profileListEntity);
}
filteredProfiles.ContentItems = profileList;
return filteredProfiles;
}
public IEnumerable<IContent> GetMcrfProfileRecords(IList<int> contentIDs)
{
return _contentManager.GetMany<IContent>(contentIDs, VersionOptions.Published, QueryHints.Empty);
}
public class McrfProfileDriver : ContentPartDriver<McrfProfilePart>
{
private const string TemplateName = "Parts/McrfProfile";
private readonly IMcrfProfileService _profileService;
private readonly IContentManager _mcrfContentManager;
public McrfProfileDriver(IMcrfProfileService profileService, IContentManager mcrfContentManager)
{
_profileService = profileService;
_mcrfContentManager = mcrfContentManager;
}
protected override DriverResult Display(
McrfProfilePart part, string displayType, dynamic shapeHelper)
{
if (displayType == "Detail")
{
McrfProfileDetailViewModel profileDetailViewModel = new McrfProfileDetailViewModel();
profileDetailViewModel.ProfileDetail = part.ProfileDetail;
return ContentShape("Parts_McrfProfile",
() =>
{
return shapeHelper.Parts_McrfProfile(ProfileDetail: profileDetailViewModel);
});
}
else
{
McrfProfileSummaryViewModel profileSummaryViewModel = new McrfProfileSummaryViewModel();
//profileSummaryViewModel.ProfileImage = part.ProfileSummary.ProfileImage;
//profileSummaryViewModel.Name = part.ProfileSummary.Name;
//profileSummaryViewModel.JobTitle = part.ProfileSummary.JobTitle;
profileSummaryViewModel.ProfileImage = part.ProfileDetail.ProfileImage;
profileSummaryViewModel.Name = part.ProfileDetail.Name;
profileSummaryViewModel.JobTitle = part.ProfileDetail.JobTitle;
profileSummaryViewModel.ContentItem = part.ContentItem;
return ContentShape("Parts_McrfProfile_Summary",
() =>
{
return shapeHelper.Parts_McrfProfile_Summary(ProfileRecord: profileSummaryViewModel);
});
}
}
//GET
protected override DriverResult Editor(McrfProfilePart part, dynamic shapeHelper)
{
return ContentShape("Parts_McrfProfile_Edit",
() => shapeHelper.EditorTemplate(
TemplateName: TemplateName,
Model: part,
Prefix: Prefix));
}
//POST
protected override DriverResult Editor(
McrfProfilePart part, IUpdateModel updater, dynamic shapeHelper)
{
updater.TryUpdateModel(part, Prefix, null, null);
return Editor(part, shapeHelper);
}
public class McrfProfileHandler : ContentHandler
{
IMcrfProfileService _profileService;
public McrfProfileHandler(IRepository<McrfProfileRecord> repository, IMcrfProfileService profileService)
{
_profileService = profileService;
Filters.Add(StorageFilter.For(repository));
OnLoading<McrfProfilePart>((context, part) => LazyLoadHandlers(part));
OnIndexing<McrfProfilePart>((context, part) => context.DocumentIndex
.Add("profile-detail", part.ProfileDetail.Name + " " + string.Join(", " , part.ProfileDetail.Publications.Select(e => e.Citation).ToArray())).RemoveTags().Analyze()
.Add("profile-name", part.ProfileDetail.Name).RemoveTags().Analyze());
}
protected void LazyLoadHandlers(McrfProfilePart part)
{
// add handlers that will load content for a profile just-in-time
part.ProfileDetailField.Loader(() => _profileService.GetProfileDetail(part.ProfileId));
//part.ProfileSummaryField.Loader(() => _profileService.GetProfileSummary(part.ProfileId));
}
}
如果有多个显示形状,您需要使用 Combined() 包装您的显示形状...并将逻辑放在匿名方法中。
不要使用子句来检查您的 DisplayType,让 placement.info 完成它的工作,一旦您掌握了它,它就会非常强大。
如果您是 Orchard 的新手,我会考虑快速浏览一些文档并下载源代码。通过查看其他零件驱动程序,您将能够了解可以改进什么以及如何改进。
我是 Orchard 的新手,但我觉得我正在取得重大进展。我一直致力于使我的显示驱动程序更高效,而构建显示似乎是最需要工作的领域。
当构建显示 30 个内容项时,以下代码大约需要 30 秒才能完成。我不知道还有什么其他方法可以为内容项构建显示形状或使其更快。
非常感谢您的反馈。
var contentItems = _profileService.GetProfileList(profileViewOptionsDetails.filteredServices, pageNumber, profileViewOptionsDetails.PageSize, queryString);
var pager = new Pager(_siteService.GetSiteSettings(), pageNumber, pageSize);
var pagerShape = shapeHelper.Pager(pager).TotalItemCount(totalItemCount);
var list = shapeHelper.List();
foreach (var contentItem in contentItems.ContentItems)
{
list.Add(_mcrfContentManager.BuildDisplay(contentItem.Content, "Summary"));
}
public FilterGroup GetProfileList(List<int> filterList, int page, int pageSize, string query)
{
IList<ProfileRoles> profileRecords = new List<ProfileRoles>();
FilterGroup filteredProfiles = new FilterGroup();
profileRecords = GetMcrfProfileList(filterList, query, page, pageSize);
filteredProfiles.ProfileCount = profileRecords.Count;
var content = GetMcrfProfileRecords(profileRecords.Select(item => item.ContentID).ToList());
IList<ProfileListEntity> profileList = new List<ProfileListEntity>();
foreach (var c in content)
{
ProfileListEntity profileListEntity = new ProfileListEntity();
profileListEntity.Content = c;
profileListEntity.Role = profileRecords.Where(x => x.ContentID == c.Id).Select(y => y.Role).ToList().First();
profileList.Add(profileListEntity);
}
filteredProfiles.ContentItems = profileList;
return filteredProfiles;
}
public IEnumerable<IContent> GetMcrfProfileRecords(IList<int> contentIDs)
{
return _contentManager.GetMany<IContent>(contentIDs, VersionOptions.Published, QueryHints.Empty);
}
public class McrfProfileDriver : ContentPartDriver<McrfProfilePart>
{
private const string TemplateName = "Parts/McrfProfile";
private readonly IMcrfProfileService _profileService;
private readonly IContentManager _mcrfContentManager;
public McrfProfileDriver(IMcrfProfileService profileService, IContentManager mcrfContentManager)
{
_profileService = profileService;
_mcrfContentManager = mcrfContentManager;
}
protected override DriverResult Display(
McrfProfilePart part, string displayType, dynamic shapeHelper)
{
if (displayType == "Detail")
{
McrfProfileDetailViewModel profileDetailViewModel = new McrfProfileDetailViewModel();
profileDetailViewModel.ProfileDetail = part.ProfileDetail;
return ContentShape("Parts_McrfProfile",
() =>
{
return shapeHelper.Parts_McrfProfile(ProfileDetail: profileDetailViewModel);
});
}
else
{
McrfProfileSummaryViewModel profileSummaryViewModel = new McrfProfileSummaryViewModel();
//profileSummaryViewModel.ProfileImage = part.ProfileSummary.ProfileImage;
//profileSummaryViewModel.Name = part.ProfileSummary.Name;
//profileSummaryViewModel.JobTitle = part.ProfileSummary.JobTitle;
profileSummaryViewModel.ProfileImage = part.ProfileDetail.ProfileImage;
profileSummaryViewModel.Name = part.ProfileDetail.Name;
profileSummaryViewModel.JobTitle = part.ProfileDetail.JobTitle;
profileSummaryViewModel.ContentItem = part.ContentItem;
return ContentShape("Parts_McrfProfile_Summary",
() =>
{
return shapeHelper.Parts_McrfProfile_Summary(ProfileRecord: profileSummaryViewModel);
});
}
}
//GET
protected override DriverResult Editor(McrfProfilePart part, dynamic shapeHelper)
{
return ContentShape("Parts_McrfProfile_Edit",
() => shapeHelper.EditorTemplate(
TemplateName: TemplateName,
Model: part,
Prefix: Prefix));
}
//POST
protected override DriverResult Editor(
McrfProfilePart part, IUpdateModel updater, dynamic shapeHelper)
{
updater.TryUpdateModel(part, Prefix, null, null);
return Editor(part, shapeHelper);
}
public class McrfProfileHandler : ContentHandler
{
IMcrfProfileService _profileService;
public McrfProfileHandler(IRepository<McrfProfileRecord> repository, IMcrfProfileService profileService)
{
_profileService = profileService;
Filters.Add(StorageFilter.For(repository));
OnLoading<McrfProfilePart>((context, part) => LazyLoadHandlers(part));
OnIndexing<McrfProfilePart>((context, part) => context.DocumentIndex
.Add("profile-detail", part.ProfileDetail.Name + " " + string.Join(", " , part.ProfileDetail.Publications.Select(e => e.Citation).ToArray())).RemoveTags().Analyze()
.Add("profile-name", part.ProfileDetail.Name).RemoveTags().Analyze());
}
protected void LazyLoadHandlers(McrfProfilePart part)
{
// add handlers that will load content for a profile just-in-time
part.ProfileDetailField.Loader(() => _profileService.GetProfileDetail(part.ProfileId));
//part.ProfileSummaryField.Loader(() => _profileService.GetProfileSummary(part.ProfileId));
}
}
如果有多个显示形状,您需要使用 Combined() 包装您的显示形状...并将逻辑放在匿名方法中。
不要使用子句来检查您的 DisplayType,让 placement.info 完成它的工作,一旦您掌握了它,它就会非常强大。
如果您是 Orchard 的新手,我会考虑快速浏览一些文档并下载源代码。通过查看其他零件驱动程序,您将能够了解可以改进什么以及如何改进。