gpt4 book ai didi

ASP.net缓存+单例模式

转载 作者:行者123 更新时间:2023-12-02 18:54:06 26 4
gpt4 key购买 nike

我有一个巨大的 XML 文档,我必须解析它才能生成域对象。

因为文档很大,我不想每次用户请求时都解析它,而只是第一次,然后将所有对象保存到缓存中。

public List<Product> GetXMLProducts()
{
if (HttpRuntime.Cache.Get("ProductsXML") != null)
{
return (List<Product>)(HttpRuntime.Cache.Get("ProductsXML"));
}

string xmlPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Content\\Products.xml");
XmlReader reader = XmlReader.Create(xmlPath);
XDocument doc = XDocument.Load(reader);

List<Product> productsList = new List<Product>();
// Parsing the products element

HttpRuntime.Cache.Insert("ProductsXML", productsList);
return productsList;
}

如何使该函数在单例中工作并且线程安全?

修复了将对象保存到缓存方法中的问题(是复制粘贴错误)

最佳答案

创建一个 Lazy static 并在应用程序的生命周期内保留在内存中。并且不要忘记“真实”部分,这就是它线程安全的原因。

public static readonly Lazy<List<Product>> _product = new Lazy<List<Products>>(() => GetProducts(), true);

要将其添加到您的模型中,只需将其设为私有(private)并返回 _product.Value;

public MyModel
{
... bunch of methods/properties

private static readonly Lazy<List<Product>> _products = new Lazy<List<Products>>(() => GetProducts(), true);

private static List<Product> GetProducts()
{
return DsLayer.GetProducts();

}

public List<Product> Products { get { return _products.Value; } }
}

要使用 Lazy<> 创建单例,请使用此模式。

public MyClass
{
private static readonly Lazy<MyClass> _myClass = new Lazy<MyClass>(() => new MyClass(), true);

private MyClass(){}

public static MyClass Instance { get { return _myClass.Value; } }
}

Update/Edit:

另一种在上下文(即 session )中使用的惰性模式

session 中保存的一些模型:

public MyModel
{
private List<Product> _currentProducts = null;
public List<Product> CurrentProducts
{
get
{
return this._currentProducts ?? (_currentProducts = ProductDataLayer.GetProducts(this.CurrentCustomer));
}
}
}

关于ASP.net缓存+单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11502584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com