MVC - 懒惰在多个地方加载1个字符串

时间:2017-06-21 00:11:43

标签: c# asp.net asp.net-mvc telerik lazy-loading

我最近在我的应用程序中添加了一些搜索功能。它运行良好,但有一个项目,称为Folder,搜索到这需要我进行一些Web服务调用。我一次最多返回100个项目,如果所有100个项目都是特定类型,并且每个项目需要3或4个Web服务调用,则最多需要30秒才能获取信息。

我得到的一点信息是PathPath与PC上的文件路径相同,并且每个级别都进行新的Web服务调用。如果我删除代码以获取返回的每个项目的此路径,我可以在大约2-3秒内将结果发送给用户,结果为100。这是在我的开发机器上,所以我希望在生产中加快一点。

我要做的是在屏幕上加载Path之后获取Folder。这样,大多数信息已经存在,供用户在可接受的时间内看到,Path加载一两秒钟。

到目前为止,我的控制器中的方法是将Path作为字符串返回:

    [HttpGet]
    public string _SearchGetFolderPath(int folderID)
    {
        using (SA sa = new SA())
        using (IRWS irws = new IRWS(sa.Ticket))
        {
            return irws.getFolderPathfromFolderID(folderID);
        }
    }

在上面的方法中,SA对象是Web服务的用户标识,IRWS对象是我保持Web服务调用的地方。

然后我认为这是:

@*Display Each Returned Result*@
        @foreach (var item in Model)
        {
            <div class="panel panel-default">
                <div class="panel-heading clearfix">
                    <h3 class="panel-title pull-left">@(item.Name)</h3>
                    <span class="pull-right">@item.AspectType.AspectName</span>
                </div>
                <div class="panel-body">
                    <dl class="dl-horizontal">
                        @foreach (var value in item.FieldValues)
                        {
                            <dt>@value.FieldName</dt>
                            @*Test if Item is a Folder and Field is Path*@
                        if (item.AspectType.AspectTypeID == -10 && value.FieldName.Contains("Path"))
                        {
                            /*Folder Path - get path*/
                            //   HERE IS WHERE I WOULD LIKE TO LAZY LOAD THE PATH
                        }
                        else if (false)
                        {

                        }
                        else
                        {
                            <dd>@value.FieldValue</dd>
                            }

                        }
                    </dl>
                </div>
            </div>
            <br />
        }

我希望这与我的应用程序的另一部分的工作方式类似。每个Folder都有一个提供更多信息的页面,我将Telerik用于我的所有用户界面,因此我懒得将Folder的孩子加载到Panel Barhttp://demos.telerik.com/aspnet-mvc/panelbar/ajax)。< / p>

非常感谢任何想法或建议。感谢。

1 个答案:

答案 0 :(得分:0)

延迟加载以某种方式烘焙到C#中,如下例可能有所帮助:

public class yourClassName {
   static object _lock = new object();
   static IDictionary<string, string> loadedValues = new Dictionary<string, string>();


   private string BuildString(int folderID) {
        if (!loadedValues.ContainsKey(folderID)) // if we dont have the value 
            using (SA sa = new SA())
            using (IRWS irws = new IRWS(sa.Ticket))
                lock(this)
                    if (loadedValues.ContainsKey(folderID)) // lets check again (maybe in btween the locks other threads did the job)
                        lock(_lock)
                            return loadedValues[folderID];
                    else // it looks like we dont have it (now it is populated)
                        loadedValues.Add(folderID, irws.getFolderPathfromFolderID(folderID));
        return loadedValues[folderID]
    }

    [HttpGet]
    public string _SearchGetFolderPath(int folderID)
    {
        return BuildString(folderID);
    }

}

懒惰加载本质上让我推荐它需要我知道更多的逻辑以及为什么使用它。

作为一个替代,当你在MVC.net世界时,你可以利用MVC缓存,这将节省你在这种情况下更多的时间(控制器方法将不会被调用和查看html / tmplate被缓存),只需添加行下面作为你方法的属性

[OutputCache(Duration = 10 /* minutes */, VaryByParam = "folderID")]

了解有关下面MVC缓存链接的更多信息

概念及其工作原理
https://msdn.microsoft.com/en-us/library/ff648482.aspx

如何使用/优化缓存
https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/controllers-and-routing/improving-performance-with-output-caching-cs