我们可以在会话中存储Sitecore项目。
以下是示例。这个项目[“/ sitecore / content / Vitality / Data / my_points / mypoints”]
我必须在许多功能中使用,因为。我想避免使用静态路径,因此希望将其存储在会话中。有没有办法解决这个问题。
Sitecore.Data.Items.Item item = contextDB.GetItem("/sitecore/content/Vitality/Data/my_points/mypoints");
答案 0 :(得分:5)
在我看来,您应该避免在会话中存储 Sitecore 项目。这可能导致潜在的内存泄漏,并且这些项目将针对每个新会话在服务器端尚未过期的每个会话进行存储,因此您的应用程序内存使用可能会增长而无需任何处理方式。
理论上 Sitecore 内置缓存应该可以正常工作但是如果它还不够你可能会尝试只缓存一些你需要用于会话中的项目的字段值而不是存储整个Item
对象。您仍然需要记住,您需要以自定义方式处理项目更改,因此每次更改项目时,都会清除或更新缓存的值。
答案 1 :(得分:1)
同意Maras Musielak。在会话中存储项目不是要走的路。 这实际上似乎是一个简单的静态类有用的少数情况之一:
static class CommonItems
{
public static Item MyPoints
{
get
{
return Sitecore.Context.Database.GetItem("{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}");
}
}
}
Sitecore.Data.Items.Item item = CommonItems.MyPoints;
另一方面,从GUID而不是路径中实例化项目几乎总是更好,因为这意味着您的代码不依赖于sitecore树的结构。
答案 2 :(得分:1)
我同意其他人的意见,因为你不应该把这个项目存放在会话中。 Sitecore项目缓存将从内存使用角度帮助您。
TwentyGotoTen使用静态getter的想法是允许您集中检索项目的好方法,这样您的代码就不必复制粘贴。
该想法的另一个扩展是不在代码中引用内容本身,而是从内容树加载配置项,可以对其进行编辑以指向不同的内容项。这样,您的作者可以在不更新静态getter的情况下更改正在引用的数据项。
这涉及在树中创建某种用于配置的项目,并在其上有一个通用链接字段项,可用于链接到我的点数据项。
这是一个更复杂的解决方案,但允许完全分离作者可能从代码访问的内容。如果您的myPoints信息不会被作者访问,并且本质上是一个“开发者”项目,那么就不需要这个额外的分离层。
示例(基于TwentyGotoTen):
static class CommonItems
{
public static Item MyPoints
{
get
{
var referenceItem = Sitecore.Context.Database.GetItem("{12345678-ABCD-12AB-1A1A-1234567890}");
var myPointsField = referenceItem.Fields["myPoints"];
if(myPointsField != null)
{
LinkField linkField = (LinkField)myPointsField;
if(linkField.IsInternal && linkField.TargetItem != null){
return linkField.TargetItem;
}
}
return null;
}
}
}
}
答案 3 :(得分:1)
根据我的实际经验,如果您正在使用InProc会话,则可以将sitecore项目保存到会话。如果您使用InProc以外的任何选项,则无法保存会话,因为Item类不可序列化。在Glass映射器类中存在一些问题,我将该项显式存储在模型类中并将其添加到会话中。
答案 4 :(得分:0)
Sitecore本身通过其API将特定项目存储在静态变量中。一个例子是FieldIDs类。所以是的,在你的图书馆做同样的事情是完全有效的。
的Drazen
答案 5 :(得分:0)
特别注意负载均衡解决方案。 您可能会丢失会话,或者需要将会话中存储的所有内容序列化。
也就是说,以一种巧妙的方式查看CompiledDomainModel来处理配置项。