这是我的观点:在处理任何非平凡的应用程序时。使用 linq2Sql 对象作为域模型是一个非常糟糕的主意。我将 linq2Sql 视为 ORM,仅此而已。数据库(与 linq2Sql 有直接对应关系)是数据的规范化。类(在 OOAD 意义上)是行为(而不是数据)的规范化。
[这些类对象基本上是镜像]...
我在使用 linq2Sql 构建应用程序时遇到了这个问题。让我们现实一点......大多数业务线应用程序都是美化的 CRUD 应用程序。因此,应用程序的大部分实体将直接对应于数据库表并不是不可能的。 我不想直接绑定到生成的 DTO,但同时我不希望重复的类在我的应用程序中乱七八糟。
所以这是我的解决方案:
我“编程到一个界面”。
假设我有一个PersonDto
(Dto 代表数据传输对象),其属性为FirstName, LastName, Age
(直接与数据库列相关)。
我创建了一个IPerson
接口并让我的 PersonD 来实现它。
[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(假设您有存储库和域对象的公共接口)。这样做将强制在您的域模型和数据访问之间进行逻辑分离。
将所有数据访问层放在一个单独的项目中(再次强制执行这种分离)。
将您的接口声明放在一个单独的项目中(这将确保您不会遇到任何循环引用)。
希望这可以帮助...