使用POCO进行延迟加载的存储库模式

时间:2010-04-08 10:08:05

标签: c# design-patterns repository data-access-layer

我正在开始一个新项目并创建业务对象和数据访问等。我只是使用普通的旧clr对象而不是任何orms。我创建了两个类库: 1)业务对象 - 保存我的所有业务对象,所有这些对象都是轻量级的,只有属性和业务规则。 2)存储库 - 这是我所有的数据访问。

我的大多数对象都会有子列表,我的问题是延迟加载这些值的最佳方法是什么,因为如果我不需要,我不想带回不必要的信息。

我已经考虑过在子属性上使用“get”来检查它是否为“null”,以及是否调用我的存储库来获取子信息。从我看到的这有两个问题: 1)对象“知道”如何获得自己我宁愿不在对象中保存数据访问逻辑。 2)这需要两个类相互引用,在visual studio中引发循环依赖性错误。

有没有人就如何克服这个问题或有关我的项目布局的任何建议以及可以改进的地方提出任何建议?

由于

4 个答案:

答案 0 :(得分:3)

要做到这一点,需要编程接口(实现的抽象)和/或声明虚拟属性。然后,您的存储库会为那些要延迟加载的属性返回一个代理对象。调用存储库的类不是更明智的,但是当它尝试访问其中一个属性时,代理会调用数据库并加载值。

坦率地说,我认为试图实现这一点是疯狂的。对于这个问题,有很多经过时间考验的解决方案,这些解决方案已经由.NET中最伟大的思想家开发和完善。

要进行代理,您可以使用Castle DynamicProxy,也可以使用NHibernate让它为您处理所有代理和延迟加载(它使用DynamicProxy)。保证,您将获得比任何手动实施更好的性能。

NHibernate不会弄乱您的POCO - 没有属性,没有基类;您只需将成员标记为虚拟以允许代理生成。

简单地说,我会重新考虑使用ORM,特别是如果你想要延迟加载;你不必放弃你的POCO。

答案 1 :(得分:2)

在查看提供的答案和进一步研究后,我发现了一篇使用委托进行延迟加载的文章。这提供了比使用代理或实现NHibernate更简单的解决方案。

这是文章的link

答案 2 :(得分:1)

如果您使用的是Entity Framework 4.0,您将获得POCO的延迟加载和支持。将允许您编写一个通用存储库来进行数据访问。

有很多关于使用EF 4.0的通用存储库模式的在线文章

HTH。

答案 3 :(得分:0)

如果延迟加载代码在运行时加载存储库( Activator.CreateInstance 或类似的东西),然后通过反射调用适当的方法,则可以绕过循环依赖性问题。当然,与反思相关的性能损失,但在大多数解决方案中往往是微不足道的。

解决此问题的另一种方法是简单地编译为单个dll - 在这里您仍然可以使用不同的命名空间在逻辑上分离您的层,并且仍然使用不同的目录来组织您的类。