Orchard CMS ContentManager BuildDisplay非常慢

时间:2015-10-01 15:17:56

标签: c# orchardcms

我对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));
    }
}

1 个答案:

答案 0 :(得分:0)

如果有多个显示形状,你需要使用Combined()包装你的显示形状...并将逻辑放在匿名方法中。

不要使用子句来检查你的DisplayType并让placement.info完成它的工作,一旦你掌握了它的功能就相当强大。

如果您是Orchard的新手,我会考虑,快速浏览一些文档并下载源代码。通过查看其他零件驱动程序,您将能够了解什么以及如何更好。