質問を正しく理解していれば、ドメインモデルを作成し、データベース内のレコードとドメインオブジェクトの間をマッピングするオブジェクトリレーショナルマッパーを作成したいと考えています。ただし、オブジェクトのフィールドの読み取りと書き込みに必要な「配管」コードでドメインモデルを汚染することを懸念しています。
一歩後退すると、基本的に、データマッピングコードを配置する場所には、ドメインクラス自体内または外部マッピングクラス内の2つの選択肢があります。最初のオプションは、Active Recordパターンと呼ばれることが多く、各オブジェクトがそれ自体を永続化する方法を知っており、ビジネスに関連しないフィールドを公開することなくマッピングを実行できるように、内部構造に十分にアクセスできるという利点があります。
例えば
public class User
{
private string name;
private AccountStatus status;
private User()
{
}
public string Name
{
get { return name; }
set { name = value; }
}
public AccountStatus Status
{
get { return status; }
}
public void Activate()
{
status = AccountStatus.Active;
}
public void Suspend()
{
status = AccountStatus.Suspended;
}
public static User GetById(int id)
{
User fetchedUser = new User();
// Lots of database and error-checking code
// omitted for clarity
// ...
fetchedUser.name = (string) reader["Name"];
fetchedUser.status = (int)reader["statusCode"] == 0 ? AccountStatus.Suspended : AccountStatus.Active;
return fetchedUser;
}
public static void Save(User user)
{
// Code to save User's internal structure to database
// ...
}
}
この例では、NameとAccountStatusを持つユーザーを表すオブジェクトがあります。ステータスが直接設定されることを許可したくありません。おそらく、変更が有効なステータス遷移であることを確認したいため、セッターがありません。幸い、GetByIdメソッドとSave静的メソッドのマッピングコードは、オブジェクトの名前フィールドとステータスフィールドに完全にアクセスできます。
2番目のオプションは、マッピングを担当する2番目のクラスを持つことです。これには、ビジネスロジックと永続性のさまざまな懸念事項を分離できるという利点があり、設計をよりテスト可能で柔軟にすることができます。このメソッドの課題は、名前フィールドとステータスフィールドを外部クラスに公開する方法です。いくつかのオプションは次のとおりです。1。リフレクションを使用する(オブジェクトのプライベート部分を深く掘り下げることに何の問題もありません)2。特別な名前のパブリックセッターを提供し(たとえば、「プライベート」という単語をプレフィックスとして付けます)、誤って使用しないようにします3 。言語がそれをサポートしている場合は、セッターを内部にしますが、データマッパーモジュールへのアクセスを許可します。たとえば、.NET2.0以降のInternalsVisibleToAttributeまたはC++のフレンド関数を使用します。
詳細については、MartinFowlerの古典的な本「PatternsofEnterpriseArchitecture」をお勧めします。
ただし、警告として、独自のマッパーを作成する前に、nHibernateやMicrosoftのEntity Frameworkなどのサードパーティのオブジェクトリレーショナルマッパー(ORM)ツールの使用を検討することを強くお勧めします。私は4つの異なるプロジェクトに取り組んできました。さまざまな理由で、独自のマッパーを作成しました。エンドユーザーに価値を提供するコードを作成する代わりに、マッパーの保守と拡張に多くの時間を浪費するのは非常に簡単です。私はこれまで1つのプロジェクトでnHibernateを使用してきましたが、最初はかなり急な学習曲線がありますが、早い段階で投資したことでかなりの成果が得られます。