mar*_*ith 6 c# dto repository-pattern automapper linq-to-sql
我已成功使用linq2sql和linq DTO(由linq2sql创建的类)....
我很困惑,我有更新旧应用程序的任务,我可以看到我的DTO将如何应用...运输日期
我正在使用存储库模式,所以我通过linq2sql dtos将数据从存储库传递到服务...一旦我在服务层(这基本上是我的业务逻辑),那么我需要传递类对象..
这些类对象基本上是dtos的镜像(或多或少) - 在某些地方有一些变化但通常是相同的..
所以回到手头的问题! - 这是一个好的做法,只使用dtos将数据从存储库传输到服务层......一旦在服务层(业务逻辑),我应该将所有我的dtos映射到那里的类对象计数器部分(当然使用automapper! !)
我的另一种选择是继续使用类似于对象的DTOS并将它们从方法传递到方法以及作为返回类型等,但我觉得这是不好的做法,我继续围着圈子想知道我应该应用哪种方法?
任何帮助真的很感激
谢谢
以下是我的观点:处理任何非繁琐的应用程序时.使用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没有理由被公开公开(假设您有自己的存储库和域对象的公共接口).这样做会强制域模型和数据访问之间的逻辑分离.
将所有数据访问层放在一个单独的项目中(再次强制执行此分离).
将您的接口声明放在一个单独的项目中(这将确保您不会遇到任何循环引用).
希望这可以帮助...
| 归档时间: |
|
| 查看次数: |
1277 次 |
| 最近记录: |