2011-12-22 14 views
0

場合によっては、実用上の理由から「裏打ち」を必要とする財産があります。バッキングプロパティの名前付け(およびマップ)方法は?

たとえば、Nameプロパティを持つタイプが1つあります。アクセス時に値が変換されることはなく、単に何らかのアクションをトリガーします。あなたが望むなら、副作用。 (それは議論のために重要ではないということはなく、変更されたとき、この特定のケースでは、名前はどこか別の場所にコピーされます。)

さんが言ってみましょう:

public class Person 
{ 
    private string __name; 

    protected internal virtual string _name 
    { 
     get 
     { 
      return this.__name; 
     } 
     set 
     { 
      this.__name = value; 
     } 
    } 

    public virtual string Name 
    { 
     get 
     { 
      return _name; 
     } 

     set 
     { 
      _name = value; 

      // action when changing the name takes place here... 
     } 
    } 
} 

だから、「_name」プロパティは次のようにマッピングされていますデータベースは保護されているため、直接変更することはできません。また、2番目のパブリックプロパティ "Name"は実際のアクセスを提供します。

私がこのように設定したのは、そのアクションがマップされた "_name"プロパティのセットメソッドに直接組み込まれていた場合、オブジェクトがデータベースから水和されたときにトリガされるからですが欲しいです。

これはすべて正常に動作します。

このタイプをクエリする必要があるとき、そのプロパティがマップされていないため、Person.Nameをクエリしようとすると機能しません。

私がこれについて嫌うのは、Person.Nameに対してコードを書いているが、Person._nameに対するクエリを書く必要があります。これはエラーが発生しやすく混乱します。

この問題を解決するには、より良い方法がありますか?

答えて

0

マッピングでのアクセスにnosetter.camelcase-underscoreを使用できますか?これは、プロパティセッターを使用する代わりにフィールドを直接設定します(たとえば、名前が正しく指定されている場合は_nameなど)。

例:

<property name="Name" column="Name" type="String" access="nosetter.camelcase-underscore"/> 
+0

だから、これは直接バッキングフィールドをマッピングし、そしてなどのプロパティを必要としないのですか? (プロパティをマッパーするのではなく、ペナルティやその他の副作用がありますか?) –

+0

はい、まさにそうです。ペナルティはありません。これはプロパティgetters/setterのコードで副作用を避けるため、プロパティを正確にマップするための推奨される方法です。 – TomMhC

+0

誰もあなたにこのようなことを教えてくれませんか? :-) ... ありがとうございました! –

関連する問題