0

コンテンツ(1対1)の関係を持つアイコンがあります。

public class Icon
{
   public virtual Content Content {get; set;}
}

デフォルトでは、遅延読み込みが必要です。ただし、コードのある時点で、コンテンツの種類を確認する必要があります。コンテンツは多形であり、次のようなものです。

if(icon.Content is TextContent)
{
 ...
}

アイコンは別の関連付けの一部であり、NHibernateによって自動的に取得されます。手動では取得しません。

この状況で実際のタイプを確認するための推奨される方法は何ですか?

実際のコンテンツタイプを識別するために列挙型となるContentTypeのような特定のプロパティを持つことができますが、別の方法があるかどうかを知りたいと思っています。

4

3 に答える 3

0

この種のチェックを行う場合は、プロパティからプロキシを削除する必要があります。それを行うにはいくつかの方法があります。

  1. セッションコールにアクセスできる場合:

    session.PersistenceContext.Unproxy(icon.Content);
    
  2. 適切なタイプのインスタンスを返すことにより、プロキシの削除を強制する仮想メソッドを(可能であれば基本クラスで)実装します。

    public virtual U As<U>() where U : YourType {
        return this as U;
    }
    
  3. プロパティの遅延初期化を無効にします。

于 2012-11-21T13:19:13.020 に答える
0

これは、最近の別の質問と非常によく似ています。

csanchezのリストに追加するには、4番目のメソッドは、Selfプロキシされていないタイプを返すプロパティをContent基本クラスに追加することです。

public virtual void Self
{
   get { return this; }
}

そして5番目の方法は、Ayendeのブログで説明されているように、マッピングで'lazy="no-proxy"`を使用することです。

于 2012-11-21T15:51:42.890 に答える
0

提案に感謝しますが、その間に私は興味深い解決策を見つけました。

ビジターパターンを使用して、IconContentビジターを定義し、実行するアクションを渡すことができます。たとえば、TextContentとImageContentがあるとすると、次のようになります。

IconContentVisitor.Func(()=> {  Console.WriteLine("this is TextContent"; }, ()=> { Console.WriteLine("this is ImageContent"));

アイデアはここから来ました:http://mookid.dk/oncode/archives/991

于 2012-11-24T17:01:34.517 に答える