gpt4 book ai didi

c# - 如何使用 Linq-2-Sql 将域逻辑与数据库/持久性逻辑分开?

转载 作者:太空狗 更新时间:2023-10-30 01:56:52 26 4
gpt4 key购买 nike

我正在尝试找到最好的方法来分离我的域逻辑和持久性逻辑的关注点。我正在使用 Linq-2-Sql 进行数据访问,并且我一直在关注 NerdDinner tutorial .如果您查看第 40 页,您会发现他们正在使用部分类将业务规则用于其 Linq 生成的类。对我来说,这感觉不对(是吗?)并且我希望拥有自己的 POCO,这些 POCO 暴露在我的应用程序的表示层中。看起来像一个选项here , 是使用单独的 DTO 类。这对我来说感觉更好,但它增加了更多代码来测试和维护。

我喜欢简单地添加部分类以在 Linq 类上执行业务规则的简单性,但我不喜欢将 Linq 类公开到我的表示层,因为如果数据库发生变化,我将需要更新表示层

DTO 方法感觉更简洁,因为如果数据库发生变化,我永远不需要更新表示层,但要处理的代码要多得多。

因此,我目前的方法是,两个类库,一个带有 Linq-2-Sql DBML + 部分类,第二个带有一组除了自动生成的属性外什么都没有的类,然后是管理获取的“ repo ”类来自 Linq 程序集的数据并将其转换为 IQueryable<T>.

有没有更好的方法?有更好的中间立场吗?我可以两全其美吗?如果是这样,您将如何将它们分成不同的程序集?

更新

也许,我真正需要做的是将所有 Persitence/Domain 逻辑整合到一个程序集中(与 NerdDinner 示例中使用的方法相同),然后在我的表示层中创建不同的“ View 对象”,它们是我的 Linq-2-Sql 实体的非规范化版本?

最佳答案

在我使用的技术允许的情况下,我尽量让我的域对象保持无知的持久性。对于 LINQ to SQL,我遵循了 Ian Cooper 提出的方法(参见 Being Ignorant with LINQ to SQLArchitecting LINQ to SQL Applications, Part 5Architecting LINQ to SQL Applications, Part 6)。基本上,您可以手动编写域对象代码并将它们连接到 LINQ to SQL 使用 sqlmetal生成到数据库的映射,然后您可以手动编辑它以满足您的需要。它对我来说效果很好。

Jeremy Miller 在 MSDN 杂志上发表了一篇关于持久性无知主题的好文章。参见 The Unit Of Work Pattern and Persistence Ignorance .

My current approach is thus, two Class Libraries one with Linq-2-Sql DBML + Partial Classes, and the second with a set of classes that have nothing but auto-generated properties and then a "repo" class that manages getting data from the Linq assembly and converting it to IQueryable<T>.

我不喜欢这种方法。它如此猛烈地违反了 DRY。

关于c# - 如何使用 Linq-2-Sql 将域逻辑与数据库/持久性逻辑分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2087460/

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