3

共通のインターフェイスから実装された Domain オブジェクトと DTO オブジェクトで nHibernate を使用しているものはありますか? すべての nHibernate 属性を Domain オブジェクトに分離して、DTO とインターフェイスをきれいにしようとしています。

この問題は、nHibernate がインターフェイスを具体的なクラスに関連付けようとするとエラーをスローすることで発生します。

NHibernate.MappingException: 関連付けがマップされていないクラスを参照しています: IContact

非休止状態のインターフェースの使用について不平を言う理由は理解していますが、それを再構築する方法を視覚化するのに苦労しています。私のコードのスケルトン複製は以下のように設定されています.私のコードをより良く構築する方法についてのアイデアはありますか?

public interface ICompany
{
    IList<IContact> Contacts { get; set; }
}

public class CompanyDTO : ICompany
{
    private IList<IContact> contacts;
    public IList<IContact> Contacts { get { return this.contacts; } set { this.contacts = value; } }

}

[ActiveRecord]
public class Company : ActiveRecordBase<Company>, ICompany
{
    private IList<IContact> contacts;
    [HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId")] 
    [ScriptIgnore]
    public IList<IContact> Contacts { get { return this.contacts; } set { this.contacts = value; } }
}

編集:

それらが同じフィールドを保持していることを確認できるように、共通のインターフェイスが必要です (つまり、一貫性を保つためにコンパイラーに依存します)。また、アプリケーションのビュー部分で DTO を使用することもできますが、ビジネスおよびデータ アクセスのために DTO をドメイン オブジェクトにキャストします。また、ICompany の Contacts のタイプが IList ではなく IList であるため、alex のソリューションは機能しません。DTO オブジェクトが Contact Domain オブジェクトを認識しないように、IContact として保持したいと考えています。

4

3 に答える 3

4

Type = typeof(Contact)具体的なケースでは、次のようにマッピング属性に追加する必要があります。

[HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId", Type=typeof(Contact))]
于 2009-03-12T15:00:28.307 に答える
0

ドメインでは、IContract を使用してドメイン エンティティを参照することはできません。代わりに Concrete クラスを使用します。バージョンを修正する場合は、次のようにします。

[ActiveRecord]
public class Company : ActiveRecordBase<Company>
{
    private IList<Contact> contacts;
    [HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId")] 
    [ScriptIgnore]
    public IList<Contact> Contacts { get { return this.contacts; } set { this.contacts = value; } }
}

ドメインと DTO を接続する意味がわかりません。それらは結合されており、同じ情報を持つことはできません。たとえば、一部の情報をドメインに非常にうまくカプセル化して保持し、他の情報はほとんど伝達しないようにすることができます。DTO は、上位レイヤーと共有するデータを転送するために作成されます。

Base クラスを使用して、エンティティと ValueObject を定義できます。簡単に言うと Entity : DomainEntity は ID 対応であり、永続化できることを意味します。ValueObject = DTO を永続化できません (ID 不可)

Sharp-Arch のコア デザインを見てください。

  • /BaseObject.cs: 基本的なオブジェクト比較サービスを提供します。
  • /Entity.cs: オブジェクトにドメイン署名と入力可能な ID プロパティを提供します。これには、NHibernate Validator の検証サポートもあります。エンティティから拡張するオブジェクトには、少なくとも 1 つの [DomainSignature] プロパティが必要です。これに違反すると、Design-By-Contract 例外がスローされます。インターフェイス IEntityWithTypedID を使用すると、独自のロールを作成できます。
  • /ValueObject.cs: これは、別の値オブジェクトと比較したときにすべてのプロパティが使用される値オブジェクトです。ValueObject から拡張されたオブジェクトには [DomainSignature] プロパティがない場合があります。これに違反すると、Design-By-Contract 例外がスローされます。
于 2009-03-12T05:33:00.587 に答える
0

また、[HasMany] 属性を持っている場合はどうすればよいですか? 実際には「Type」というプロパティ名はありませんが、[Property] と [BelongsTo] にはあります。

アップデート

答えは、使用することですCollectionType = typeof(YourType)

更新 2

いいえ、機能しません。このプロパティはコレクション タイプ、つまりリストなどに設定されています。[HasMany(typeof(meType), ...)] を設定しようとしていますが、まだ機能しません。

于 2010-02-12T16:15:19.020 に答える