我在c#中创建了一个相当简单的方法,但我在页面的任何地方都使用它。有没有办法减少方法调用,我的意思是一旦调用方法,返回值存储在某处,我使用该值代替。这是我的代码。
我已经宣布了一些像这样的公共财产。
public OrderCollection GetAllClickCollectOrders
{
get
{
return GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString());
}
}
public OrderCollection GetShippedClickCollectOrders
{
get
{
return GetShippedClickCollectOrderDetails();
}
}
以下是方法..
protected OrderCollection GetClickCollectOrderDetails(string postcode)
{
// some database ziggy wiggy...
return cncOrderCol;
}
protected OrderCollection GetShippedClickCollectOrderDetails()
{
// some database ziggy wiggy...
return cncShippedOrderCol;
}
所以,让我们说我想要的收藏方式是我这样称呼的。
BindGridView(GetAllClickCollectOrders);
orderCount.Text = "Total orders placed: " + GetAllClickCollectOrders.Count;
if (isShipped.Checked)
{
BindGridView(GetShippedClickCollectOrders);
orderCount.Text = "Total orders shipped: " + GetShippedClickCollectOrders.Count;
}
因此,每当我使用该属性时,它每次调用方法并转到数据库并返回结果。但是,除非我更改Session["SelectedStorePostCode"]
值,否则大多数时间结果都是相同的。我在想是否有更好的方法可以将结果存储在某处并使用它。
注意:代码工作正常但我正在寻找更好的性能。谢谢你们......
答案 0 :(得分:2)
您似乎想要的是缓存数据库调用的结果。
您可以通过将数据库中的结果存储在Cache
类的实例中来实现。
Cache
项可以设置为在一定时间后过期,因此如果基础数据发生变化,您可以确定该值会经常更新。
这适用于在所有用户(会话)之间共享的项目 - 如果您希望缓存用户之间唯一的项目,则可以将值存储在会话变量中,但这可能会导致Web服务器上的内存压力。
答案 1 :(得分:1)
System.Lazy<T>
应该是您正在寻找的。 p>
public OrderCollection GetAllClickCollectOrders {
get {
return m_allClickCollectOrders.Value;
}
}
private Lazy<OrderCollection> m_allClickCollectOrders = new Lazy<OrderCollection>(
() => GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString()));
当然,这假设值在初始化后永远不会改变。如果它可以改变,其他答案可能更适合。
答案 2 :(得分:1)
之类的东西?
private string collectOrders = String.Empty;
public OrderCollection GetAllClickCollectOrders
{
get
{
if(String.IsNullOrEmpty(collectOrders)
collectOrders = GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString());
return collectOrders;
}
}
答案 3 :(得分:1)
您可以将值存储为Session
变量;
public OrderCollection GetAllClickCollectOrders
{
get
{
if(Session["OrderCollection"] == null)
{
Session["OrderCollection"] = GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString());
return Session["OrderCollection"] as OrderCollection;
}
}
此方法的一个缺点是您无法知道数据库中是否有任何更改。如果价值不变,没问题;否则,您需要实现适当的缓存机制,以在db更改时删除相关的会话变量。
答案 4 :(得分:1)
你能不能拥有:
private OrderCollection AllClickCollectOrders;
public OrderCollection GetAllClickCollectOrders
{
get
{
if(AllClickCollectOrders == null)
{
AllClickCollectOrders = GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString());
}
return AllClickCollectOrders;
}
}
答案 5 :(得分:1)
简单回答:
OrderCollection _GetAllClickCollectOrders = null;
bool goToDB = false;
public OrderCollection GetAllClickCollectOrders
{
get
{
if(_GetAllClickCollectOrders == null || goToDB)
_GetAllClickCollectOrders = GetClickCollectOrderDetails(Session["SelectedStorePostCode"].ToString());
return _GetAllClickCollectOrders;
}
}