2009-09-20 53 views
0

我在我的Customer类中添加了一个名为Orders的lazyloaded属性。你认为将数据缓存在私人领域是明智的吗?是否有必要使用Subsonic 3简单存储库缓存懒惰加载属性的数据?

private IList<Order> _orders; 

[SubSonicIgnore] 
public IList<Order> Orders 
{ 
    get 
    { 
     if (_orders == null) 
     { 
      var repository = new SimpleRepository("MyConnectionString", SimpleRepositoryOptions.None); 
      _orders = repository.Find<Order>(x => x.CustomerId == this.CustomerId); 
     } 
     return _orders; 
    } 
} 

还是更不缓存它像这样:

[SubSonicIgnore] 
public IList<Order> Orders 
{ 
    get 
    { 
     var repository = new SimpleRepository("MyConnectionString", SimpleRepositoryOptions.None); 
     return repository.Find<Order>(x => x.CustomerId == this.CustomerId); 
    } 
} 

我问的原因是因为我认为这是对缓存性能考虑的数据是个好主意,但在同时我担心缓存数据可能会导致某些其他进程不同步从数据库插入/删除记录。

回答

0

就您的情况而言,您的客户对象的生命周期中存在您的缓存订单。如果您需要清除缓存的订单,则可以简单地重新查询您的客户。

如果我是你,我会添加一个名称指定存在缓存的属性,添加一个自定义的cacheScope对象(如transactionScope,缓存只存在于存在的范围内),或者在文档中指定哪些属性将执行子对象的缓存以及多长时间。

我不会删除缓存。我会把它留在那里作为一个额外的财产。如果你需要它,你会得到它。

感谢您展示您的缓存逻辑。这是我的。在我的情况下,我父母对象的预期寿命很短,我不希望> 100条父母/子女总数据的记录,我确实希望所有的孩子数据都会被使用。如果我的数据发生变化,那么我需要重新读取我在此特定实例中使用的缓存逻辑:

private static List<HostHeader> _cachedHostHeaders; 

public List<HostHeader> CachedHostHeaders 
{ 
    get 
    { 
     if (_cachedHostHeaders == null) 
      _cachedHostHeaders = this.HostHeaders.ToList(); 

     return _cachedHostHeaders.Where(i => i.SiteID == this.ID).ToList(); 
    } 
}