【问题标题】:Entity References with Services and Repositories带有服务和存储库的实体引用
【发布时间】:2010-05-31 10:12:04
【问题描述】:

我正在努力让自己习惯于 TDD、DI 和基于模式的开发。到目前为止,我对应用程序开发并不陌生,但由于我计划在几个月内开始一个(大)新项目,所以我想从一开始就做好准备;)。

当前架构基于基于 WCF 的 AppServer、MS SQL 数据库和访问 AppServer 的 WPF/WCF 客户端。

我有 3 个实体,Stay、Apartment 和 Guest。住宿参考 1 间公寓和 1 位客人。 3 个实体中的每一个都有自己的存储库(因为据我所知,它们是根实体)。实体类是 POCO,在服务器和客户端中都使用。存储库在内部使用 OR/Mapper(目前是实体框架)。

目前有 3 个 WCF 服务,每个实体一个处理 CRUD 操作...更多将及时跟进。

现在我的问题... 实体的引用应该发生在哪一层?存储库不应相互依赖(为了便于替换,但如果需要,它们可以松散耦合地相互依赖,因为我已经使用 LightCore 作为 DI 容器)。 据我了解,引用可以在存储库或服务中设置。

什么是“正确”或更优雅的方式?

也许我误解了一些东西,但引用似乎并不真正有效。 例如,如果我有 10,000 间住宿、15,000 名客人和 150 间公寓。如果我想从服务中返回 500 次住宿,包括关联的客人(500 次似乎合理,尽管我想返回更多),那么这将高达 500 * 15,000 = 750 万次迭代。 这似乎不是很有效。当然,可以缓存它,但缓存只能在一定程度上有所帮助。

还是我在设计中的某个地方存在误解?每一个建议都将不胜感激:)

[编辑] 我仍然不确定如何继续我的设计,因此我们将不胜感激。

【问题讨论】:

    标签: wcf repository design-patterns


    【解决方案1】:

    在我看来,存储库模式的诀窍在于不仅要考虑原子根实体的上下文,还要考虑聚合的并行上下文。为了说明,假设我只有两个实体,书和作者。我将为每一个都有一个存储库,但是说这两个只在 Book 或 Author 上运行是不真实的(尤其是在使用 EF 时)。一本书可能有多个作者,并且作者可能已经出版了多本书。

    例如,要创建一本新书,我会在书库上使用创建操作,但要将新书与现有作者相关联(例如,由于某种原因存在这种情况),我可能对我的作者有一个方法名为 AddBookToAuthor(int authorId,Book book)的存储库。这将有效地检索有问题的作者,将书添加到作者的 Books 集合中,如果这本书是新书,则实际上在数据存储中创建新书实例。

    【讨论】:

    • 所以你是说引用应该发生在存储库中?虽然我目前正在使用 EF,但我想保留更改单个存储库的数据源的选项,而无需更改访问第一个存储库的其他存储库(就像你描述的方式一样)。
    • 假设您使用的是直接 POCO,并且只将 POCO 传入和传出存储库,从技术上讲,您可以拥有一个使用 EF 的存储库,一个使用 NHibernate,一个使用直接 ADO.NET。归根结底,存储库将成为您的业务层进行数据访问的边界。
    • 好的,澄清一下,在我前面提到的场景中,Stay-Repository 的 GetAllStays() 方法是否会访问 Guest-and Apartment-Repository 并返回已引用的 Guest-and Apartments 的住宿列表?
    • 不,在我描述的场景中不会。 Stay-Repository 应该能够获取一个 Stay 实例列表,如果这是您的需要,它的 Guest 和 Apartment 属性已实例化和关联。在 EF 中,即使使用 POCO 也很容易做到这一点,如下所示: db.Stays.Include("Guest").Include("Apartment").Where(s => s.StayId = stayId) 除了一些非常具体的边缘案例,我从来都不喜欢让一个存储库引用另一个存储库。
    • 好吧,现在我很困惑:D 前提是每个存储库都处理它自己的聚合根,并且每个存储库都可以轻松替换,而不会影响其他应该在哪里进行引用?执行 GetAllStays() 其他存储库的 GetSomethingById() 以填充引用并返回填充引用的停留,还是返回带有引用的停留 == null 以便调用类(例如 WCF 服务)必须询问相关实体的其他存储库并填写参考资料本身?
    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2016-11-30
    • 2022-11-20
    • 1970-01-01
    相关资源
    最近更新 更多