gpt4 book ai didi

c# - 使用 POCO 延迟加载的存储库模式

转载 作者:太空狗 更新时间:2023-10-29 19:40:11 27 4
gpt4 key购买 nike

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

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

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

有没有人对如何解决这个问题有任何建议,或者对我的项目布局有什么建议以及可以改进的地方吗?

谢谢

最佳答案

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

坦率地说,我认为尝试自己实现它是疯狂的。 .NET 中最伟大的思想家已经开发和改进了针对此问题的耗时考验的出色解决方案。

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

NHibernate 不会与您的 POCO 混淆——没有属性,没有基类;您只需将成员标记为虚拟即可生成代理。

简而言之,我会重新考虑使用 ORM,尤其是当您想要延迟加载时;您不必放弃您的 POCO。

关于c# - 使用 POCO 延迟加载的存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2598970/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com