存储库模式和数据访问

时间:2010-09-22 16:17:16

标签: nhibernate repository-pattern

我正在尝试使用ASP.NET MVC和NHibernate(Newbie)进入一个项目,并寻求从DAL更快的数据访问。

我的解决方案将是粗略的 asp.net mvc ------业务层 - 数据访问层 ----------所有受基础设施层支持----------------

我的项目与分类广告和社区网站有关,必须有更快的数据访问权。

我非常喜欢KIGG实现,但我不确定存储库模式是否适合更快的数据访问。

我看过S#arp架构,对我来说太大了。

在存储库上我也计划转移KIGG实现并使用以下内容来检索对象

IRepository {

void Add(); void Remove();

public IQueryable FindAll(Func exp)         {             return GetTable.Where(exp).AsQueryable();         }

}

每日网站点击量可能在10000到15000左右,是否可以使用以上“全部查找”的存储库模式?

在阅读了Repository模式的最后几天以及专家自己之间存在意见分歧的事实后,我对如何有效使用存储库感到困惑,(http://ayende.com/Blog/archive/2009/04/17/repository-is-the-new-singleton.aspx

我知道这个问题很模糊,但任何建议都值得赞赏。

EDIT * 1

我喜欢关于DAL的这一点: 尝试封装以使事情更容易使用,很棒。试图封装,以便您可以切换OR / Ms?不会起作用,既费钱又痛苦。

EDIT * 2

我倾向于“CQRS”模式。它似乎是合乎逻辑的,从我阅读的内容来看,即使过时,也会使读取速度更快。 根据域对象从域中读取将导致不必要的处理以填充AggregateRoot,然后将它们转换为ViewModel。

谢谢你, 三月

1 个答案:

答案 0 :(得分:1)

对于nHibernate,只需返回应用表达式后nHibernate LINQ为您创建的IQuerable(如果需要)。

你不想做的是让nHibernate将所有内容转换为列表或其他对象,然后在其上使用AsQueryable。简单地:

return Session.Linq<T>.Where(Exp);

这可能不是您最初的想法,但通过这样做,您可以使用LINQ的强大功能以及您使用IQueryable进行的操作一直复制到数据库。例如,如果方法的调用者只是想要一个聚合,那么聚合可能发生在数据库服务器上并且更有效,而不是检索所有记录然后在本地执行聚合。

请记住 - 使用IQueryable,您只需构建一个表达式树,直到达到树实际需要被执行的程度。当发生这种情况时,使用像LINQ to nHibernate这样的DB LINQ提供程序,解析表达式树中的任何内容,并为数据库创建查询。您可以获得性能提升,因为只需要从数据库中删除所需内容 - 不多或少。

因为它出现在数据库中,所以您描述的模式应该可以正常工作。您不会每次都检索所有实体,只需要检索所有实体。

与往常一样,这可能不适合您的情况。