DTO(linq2sql)和Class对象之间的混淆!

时间:2009-08-24 15:31:45

标签: c# linq-to-sql repository-pattern automapper dto

我已成功使用linq2sql和linq DTO(由linq2sql创建的类)....

我很困惑,我有更新旧应用程序的任务,我可以看到我的DTO将如何应用......运输日期

我正在使用存储库模式,所以我通过linq2sql dtos将数据从存储库传递到服务...一旦我在服务层(这基本上是我的业务逻辑)然后我需要传递类对象..

这些类对象基本上是dtos的镜像(或多或少) - 在某些地方有一些变化但通常是相同的。

所以回到手头的问题! - 这是一个好的做法,只使用dtos将数据从存储库传输到服务层......一旦在服务层(业务逻辑),我应该将所有我的dtos映射到那里的类对象计数器部分(当然使用automapper! !)

我的另一种选择是继续使用类似于对象的DTOS并将它们从方法传递到方法并作为返回类型等但是我觉得这是不好的做法,我继续绕圈子想知道我应该应用哪种方法?

任何帮助真的很感激

感谢

4 个答案:

答案 0 :(得分:5)

以下是我的意见: 处理任何非繁琐的应用程序时。使用linq2Sql对象作为域模型是一个非常糟糕的主意。我认为linq2Sql是一个ORM,仅此而已。数据库(linq2Sql直接对应)是数据的标准化。类(在OOAD意义上)是行为(不是数据)的标准化。

  

[这些类对象基本上是镜像] ...

在使用linq2Sql构建应用程序时遇到了这种情况。让我们务实......大多数业务应用程序都是美化的CRUD应用程序。因此,大部分应用程序的实体将直接对应于数据库表并不是不可能的。 我不想直接绑定到生成的DTO,但与此同时我不希望在我的应用程序中散布重复的类。

所以这是我的解决方案:
我“编程到一个界面”。

假设我有一个PersonDto(Dto代表数据传输对象),其属性为FirstName, LastName, Age(与数据库列直接相关)。

我创建了一个IPerson界面,让我的PersonDto实现了它。


  [Table(Name="Persons")]
  internal class PersonDto : IPerson
  {
      ....
  }

我的存储库方法将接收并检索IPerson而不是Linq2Sql类。


    IPerson somePerson = _repository.Get(someGuid);
    somePerson.FirstName = "SomeName";
    _repository.Save(somePerson);

这种方法对我来说非常有效。每当我觉得我需要偏离DTO时,我可以相当容易地做到这一点,因为界面代表我的对象而不是DTO。

一些通用指针: 手动构建你的DTO ......我知道这听起来很疯狂,但是你会发现它在自上而下的测试驱动开发方法中运行得非常好。您的DTO(linq2Sql)对象非常轻,可以在.dbml设计器之外进行更改。

保持DTO和DataContext的内部。您的dto没有理由被公开公开(假设您有自己的存储库和域对象的公共接口)。这样做会强制域模型和数据访问之间的逻辑分离。

将所有数据访问层放在一个单独的项目中(再次强制执行此分离)。

将您的界面声明放在一个单独的项目中(这将确保您不会遇到任何循环引用)。

希望这会有所帮助......

答案 1 :(得分:3)

我实际上对这个主题有类似的问题,尽管我的意图略有不同。建议使用Linq2SQL类作为域对象,并利用其他人提到的部分类。我主要担心的是这些对象的形状(即属性名称),以及类成员的可访问性(例如,私有v.s.受保护)。

可以通过使用t4模板来解决对象的形状甚至可访问性,其中Damien Guard已经将T4模板放在一起,以允许您控制Linq2Sql将为您生成的类的形状。这可以在T4 template for Linq2SQL看到。

这是我将要研究的方法,看看它是否解决了我的问题。此外,如果您的服务层可以接受方法参数的接口,您还可以通过Linq2SQL DTO周围的接口包装器控制服务层可以访问的内容。

希望这有帮助。

答案 2 :(得分:2)

这是我见过的关于该主题的最佳讨论之一:

http://blog.wekeroad.com/blog/linqtosql-momma-said-knock-you-out/

最后,耦合和凝聚决定是情境化的,你必须决定什么是最适合你的情况。

当你的应用程序超过LinqToSql时,将LinqToSql拉出来并插入另一个ORM是多么容易?这是你必须认真考虑的事情。

通常,尽量减少业务层对LinqToSql的了解。应该从UI层完全隐藏LinqToSql(您的业务层构成了这个盾牌的一大块)。使用LinqToSql进入错误的架构路径非常容易,事后可能很难回到正确的路径上。

答案 3 :(得分:0)

linq2sql设计器生成的类是部分类,因此您可以扩展这些类并将业务逻辑直接放入它们中。想法是linq用于持久化/重建这些实体,因此您可以避免使用您正在讨论的那种映射。