2

我已经为我的项目采用了存储库/服务设计模式,并且在构建它时,我自言自语。

获取存储库的所有项目(将其保存在缓存中)然后使用 LINQ 过滤而不是每次调用都使用数据库连接会更好吗?

例如,我有这个:

public Asset Get(int id)
{
    return GetAll().Where(a => a.Id == id).FirstOrDefault();
}

public IList<Asset> GetAll()
{
    return AssetData.Get(userId, companyId);
}

代替:

public Asset Get(int id)
{
    return AssetData.Get(id, userId, companyId);
}

public IList<Asset> GetAll()
{
    return AssetData.Get(userId, companyId);
}

我认为第一个是最好的,因为它会加快系统速度,并且会减少数据库连接/查询。

那么,任何人都可以向我解释一下这种情况的最佳做法是什么?

4

2 回答 2

4

这是过早的优化。在您开始使用该应用程序之前,您不知道瓶颈在哪里。等到你开始获得性能命中,然后看看你可以做些什么来提高性能。您还第二次猜测许多服务每天都在使用的成熟技术。如果处理得当,数据库是相当健壮和高性能的。

通过将存储库放在接口后面,您已经做了正确的事情。这使您可以灵活地更改实现,而无需更改使用代码。考虑使用内置缓存的 ERM 解决方案,例如NHibernate 。重新发明其他人一直在改进的轮子是没有意义的。

于 2013-08-05T16:22:51.033 回答
2

正如@Brian 评论的那样,这里最大的问题是什么最适合您和您的特定场景。我(个人)会警惕缓存任何有可能在请求之间过时的应用程序数据,即在您的情况下,用户已经更新了资产记录,但是因为它已被缓存,您的用户将无法看到更新,直到缓存已过期或已刷新(这只会让人感到困惑!)。

但是,我使用了与您在最近的应用程序中提出的技术类似的技术,在该应用程序中,我使用缓存的查找数据来填充返回 DTO 中的描述值。在测试期间,这比跨 10 多个表连接以获得这些值的数据库查询要快得多。我使用的查找数据很少更改,但为了以防万一,我在 30 分钟后过期了缓存。

我认为您还需要意识到过早的优化,并可能尝试解决您实际上可能没有的问题。

于 2013-08-05T15:57:02.547 回答