ここに私の意見があります:自明ではないアプリケーションを扱うとき。ドメイン モデルとして linq2Sql オブジェクトを使用することは、非常に悪い考えです。linq2Sql は ORM であり、それ以上のものではありません。データベース (linq2Sql が直接対応している) は、dataの正規化です。クラス (OOAD の意味で) は、 (データではなく)動作の正規化です。
[これらのクラス オブジェクトは基本的にミラー イメージです]...
linq2Sql でアプリケーションを構築しているときに、これに遭遇しました。現実的に考えてみましょう....ほとんどの基幹業務アプリケーションは、美化された CRUD アプリケーションです。したがって、アプリケーションのエンティティの大部分がデータベース テーブルに直接対応することは問題外ではありません。 生成された DTO に直接バインドされたくはありませんでしたが、同時に、重複したクラスがアプリケーション全体に散らばりたくありませんでした。
だからここに私の解決策があります:
私は「インターフェースにプログラムしました」。
(データベース列に直接関連する)のプロパティを持つ(Data PersonDto
Transfer Objectを表す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 を公に公開する理由はありません (リポジトリとドメイン オブジェクトのパブリック インターフェイスがある場合)。これを行うと、ドメイン モデルとデータ アクセスが論理的に分離されます。
すべてのデータ アクセス レイヤーを別のプロジェクトに配置します (この分離を強制するため)。
インターフェイス宣言を別のプロジェクトに配置します (これにより、循環参照が発生しないようになります)。
お役に立てれば...