gpt4 book ai didi

linq-to-sql - 带有旧数据库和 Linq to SQL 的存储库模式

转载 作者:行者123 更新时间:2023-12-01 00:05:20 28 4
gpt4 key购买 nike

我正在旧数据库(我无法更改)之上构建应用程序。我使用 Linq to SQL 进行数据访问,这意味着每个表都有一个 (Linq to SQL) 类。

我的域模型与数据库不匹配。例如,有两个表名为 UsersEmployees ,因此我有两个名为 User 的 Linq to SQL 类和 Employee .但是在我的域模型中,我想要一个 User应该包含来自任一表的一些字段的类(但我不关心这些表的许多其他字段)。

我不确定我应该如何设计我的存储库:

  • 存储库是否应该执行 Linq 到 SQL 类(例如 UserEmployee )到域类( User )之间的映射,并且只将域类返回给应用程序
  • 或者我的存储库是否应该将 Linq 返回到 SQL 类并将映射留给调用者

  • 第一种方法对我来说似乎更有意义,但这是实现我的存储库的正确方法吗?

    最佳答案

    纯粹主义者(我尽量保持纯粹)会告诉你你的模型代表你的数据。因此,任何需要持久化的东西都只在需要时通过存储库完成。此外,当您有复杂的实体时,您希望使用服务来组合它们。例如,只能通过 IUserEmployeeService 访问的 User + Employee = UserEmployee 实体。

    有了这些含糊的陈述,您在这里就有了绝佳的机会。

    构建一个反腐败层,它允许您同时开始迁移旧数据库。

    这是 DDD 手册中的另一章。 Anti-Corruption 层用于与使用 Facades、Translators 和 Adapters 的遗留系统进行交互,以将遗留 DB 与您的纯域模型隔离。

    现在,这可能比您想要的工作多得多。所以,此时你必须问自己:

    Do I want to start the process of moving off of this legacy DB, or will it remain for the life of the application?



    如果您的答案是您可以开始迁移,那么按照您想要的方式为您的实际域建模。使用普通的存储库和服务坚持它。按照您希望的存储方式设计它,玩得开心。然后,使用聚合根的服务进入反腐败层并拉出实体,在本地存储/更新它们,并转换为您域的实体。

    如果答案是遗留数据库将在项目的整个生命周期内保留,那么您的任务就容易多了。使用您域的服务(例如 UserEmployeeService)进入反腐败的 UserFacade 和 EmployeeFacade(类似于“远程服务”概念)。

    在 Facades 中,使用适配器(例如 LegacyDbSqlDatabase)访问旧数据库以获取原始 legacyUser()。下一步是使用 UserTranslator() 和 EmployeeTranslator() 映射器,将遗留用户数据转换为 User() 实体的实际域版本,并将其从 UserFacade 返回到您的 UserEmployeeService,在那里它与来自同一个地方的 Employee 实体。

    哇,打字太多了...

    使用您的反腐败层的适配器和外观,您可以执行 Linq-to-Sql 或任何您想做的事情。这无关紧要,因为您已经将遗留数据库/系统与您漂亮而纯粹的域完全隔离了 - 您的域具有自己的 User() 和 Employee() 实体和值对象版本。

    关于linq-to-sql - 带有旧数据库和 Linq to SQL 的存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1639937/

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