Linq to sql 具有遗留数据库和Linq to SQL的存储库模式

Linq to sql 具有遗留数据库和Linq to SQL的存储库模式,linq-to-sql,domain-driven-design,ddd-repositories,Linq To Sql,Domain Driven Design,Ddd Repositories,我正在遗留数据库(我无法更改)之上构建一个应用程序。我使用LINQtoSQL进行数据访问,这意味着每个表都有一个(LINQtoSQL)类 我的域模型与数据库不匹配。例如,有两个名为Users和Employee的表,因此我有两个名为User和Employee的Linq到SQL类。但在我的域模型中,我希望有一个User类,它应该包含两个表中的一些字段(但我不关心这些表中的许多其他字段) 我不确定应该如何设计我的存储库: 存储库是否应该执行Linq到SQL类(例如,User,Employee)到域类

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

我的域模型与数据库不匹配。例如,有两个名为
Users
Employee
的表,因此我有两个名为
User
Employee
的Linq到SQL类。但在我的域模型中,我希望有一个
User
类,它应该包含两个表中的一些字段(但我不关心这些表中的许多其他字段)

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

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

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

DDD和Linq to SQL不能很好地结合在一起,因为生成的类并不意味着与您的DB表结构有很大的偏离。您必须以一种使使用Linq到SQL变得困难的方式映射类,或者只使用非理想的对象模型

如果您真的想利用DDD和存储库模式,请选择实体框架或更好的NHibernate。

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

有了这些模糊的陈述,你在这里有一个极好的机会

构建一个反腐败层,它允许您同时开始脱离遗留数据库

这是DDD剧本中的另一章。反损坏层用于使用Facades、Translator和Adapter与遗留系统接口,以将遗留数据库与纯域模型隔离

现在,这可能比你想要的要多得多。因此,在这一点上,你必须问问自己:

我想开始这个过程吗 离开这个遗留数据库,或者 它将保留一辈子 申请

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

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

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

哇,打字太多了

通过适配器和反腐败层的外观,您可以执行LINQtoSQL或任何您想执行的操作。这并不重要,因为您已经将遗留数据库/系统与您的优秀纯域(您的域有自己版本的User()和Employee()实体和值对象)完全隔离开来