代码之家  ›  专栏  ›  技术社区  ›  Nate CSS Guy

如何用linq-2-sql将域逻辑与db/persistence逻辑分开?

  •  4
  • Nate CSS Guy  · 技术社区  · 15 年前

    我试图找到最好的方法来分离我的域逻辑和持久性逻辑的关注点。我正在使用LINQ-2-SQL进行数据访问,我一直在跟踪 NerdDinner tutorial . 如果您查看第40页,您可以看到他们正在使用部分类到业务规则到他们的LINQ生成的类。对我来说,这感觉不对(是吗?)我还想拥有自己的POCO,它们将暴露在我的应用程序的表示层中。看起来是一种选择 here ,是使用单独的DTO类。这让我感觉更好,但它增加了更多的代码来测试和维护。

    我喜欢简单地添加部分类来对Linq类强制执行业务规则,但我不喜欢将Linq类公开给我的表示层,因为如果数据库发生更改,我也需要更新表示层。

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

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

    有更好的方法吗?有更好的中间地带吗?我能两全其美吗?如果是这样,你会如何将它们分离成不同的组件?

    更新

    也许,我真正需要做的是将所有Persistence/域逻辑合并到一个程序集中(Nerddinner示例中使用的方法相同),然后在我的表示层中创建不同的“视图对象”,这是我的Linq-2-SQL实体的非规范化版本?

    2 回复  |  直到 15 年前
        1
  •  3
  •   jason    15 年前

    我试图让我的域对象像我使用的技术所允许的那样,保持对持久性的无知。对于Linq to SQL,我遵循了 Ian Cooper (见 Being Ignorant with LINQ to SQL ,请 Architecting LINQ to SQL Applications, Part 5 Architecting LINQ to SQL Applications, Part 6 )基本上,您可以手动编写域对象的代码,并使用 sqlmetal 生成到数据库的映射,然后您可以手动编辑以满足您的需要。对我来说效果很好。

    杰里米·米勒在《msdn》杂志上有一篇关于持续无知的文章。见 The Unit Of Work Pattern and Persistence Ignorance .

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

    我不喜欢这种方法。干得太厉害了。

        2
  •  0
  •   RichardOD    15 年前

    你见过吗? AutoMapper 是吗?如果你 look at the blog 你会看到你描述的情况。