我已被成功地与LINQ2SQL工作和LINQ DTO的(由LINQ2SQL创建的类)......

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

我使用的存储库模式,所以我从存储库经由LINQ2SQL DTOS将数据传递到所述服务...一次我在服务层(这基本上是我的业务逻辑),然后我需要通过围绕类对象..

这些类对象是basicaly镜像(更多或更少)的DTOS的 - 有一些变化在某些地方,但大致相同..

于是又回到了这个问题在手! - 是仅使用传输数据DTOS从仓库到服务层这个好习惯......而一旦在服务层(业务逻辑)我应该,但我所有的DTOS映射到那里类对象计数器部分(当然使用automapper! !)

我的另一种方法是继续使用像类对象的DTOS和方法,通过他们周围,以方法和返回类型等,但我觉得这是不好的做法,我一直转圈圈想我应该申请哪种方法?

任何帮助真的理解

感谢

有帮助吗?

解决方案

下面是我的看法: 当与任何非繁琐的申请处理。使用您的LINQ2SQL对象作为你的域模型是一个非常糟糕的主意。我看到LINQ2SQL作为一个ORM,仅此而已。数据库(其LINQ2SQL有直接对应关系到)是数据的归一化。类(在OOAD意义上)是的行为(不是数据)的归一化。

  

[这些类对象是basicaly镜像] ...

我LINQ2SQL构建应用程序时遇到了这一点。让我们面对现实....商业应用最行是荣耀的CRUD应用程序。因此,它是不出来,你的应用程序的实体有很大比例会直接对应到数据库表的问题。 我不想直接绑定到DTO的生成的,但在同一时间,我不希望在我的应用程序充斥复制类。

因此,这里是我的解决办法:点击 I “编程到一个接口”。

可以说我有一个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的要公开曝光(因为你有你的存储库和域对象的公共接口)。这样将迫使域模型和数据访问之间的逻辑分离。

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

把你的接口声明在一个单独的项目(这将确保你不会遇到任何循环引用)。

希望这有助于...

其他提示

其实我也有类似的问题,关于这个话题虽然我的意图是略有不同。该建议是使用LINQ2SQL类作为领域对象和其他人所说的采取局部类的优势。我主要担心带着这些对象(即属性名称)的形状,和类成员的可访问性(即保护例如私人V.S.)。

物体的形状,甚至可以无障碍使用,其中达明卫队已建立了T4模板,让你控制LINQ2SQL会为您生成的类的形状T4模板来解决。这可以在这里看到 T4模板LINQ2SQL

这是我要看看,看看它是否解决了我的顾虑的方法。此外,如果你的服务层可以接受的方法参数的接口还可以控制哪些服务层通过在你的LINQ2SQL的DTO接口封装访问。

希望这有助于。

这是我见过的话题的讨论最好的一个:

http://blog.wekeroad.com/博客/ linqtosql-妈妈,说敲,你出/

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

当你的应用程序会跨出LinqToSql,多么容易将它被猛拉出来LinqToSql并插入另一ORM在它的地方吗?这是你必须认真思考的东西。

在一般情况下,尽量减少你的业务层具有约LinqToSql知识。 LinqToSql应该从你的UI层被完全隐藏(业务层弥补了这一屏蔽的好大块)。这很容易往下走错误的道路architectual与LinqToSql,它可以是很难找回事后在正确的道路上。

由LINQ2SQL设计器生成的类是局部类,这样可以延长这些,直接把你的业务逻辑放进去。这个想法是,LINQ用于保留/重建这些实体这样就可以避免那种你正在谈论的映射。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top