2011-04-04 74 views
2

我想做到這一點在NHibernate的映射對象:NHibernate是否會覆蓋映射的setter?

private ShiftTradeOffer m_Offer; 

    public virtual ShiftTradeOffer Offer{ 
     get { 
      return m_Offer; 
     } 
     set { 

      //... Do some stuff ... 

      if (condition) 
      { 
       m_Offer = value; 
      } else { 
       throw new Exception("whoops!"); 
      } 

     } 
    } 

(ShiftTradeOffer是一個映射屬性)

1)請問這樣的事情不會成爲問題?

2)創建對象時是否調用setter?

3)就強制驗證而言,這是否違背最佳實踐?我想在這個類中嵌入對象特定的行爲。

回答

3

1)根據定義,屬性應該不會拋出異常。您的方法違反了這一最佳做法。

2)原始的setter被調用,因爲NHibernate只是創建一個調用底層getter/setter的代理。 我們使用包含序列化邏輯的屬性來映射序列化的數據,否則將無法工作。

例子:

public virtual List<Foo> Foos {get;set;} 
public virtual string SerializedFoos 
{ 
    get { return JsonConvert.Serialize(Foos); } 
    set { Foos = JsonConvert.Deserialize<List<Foo>>(value); } 
} 

只有SerializedFoos屬性映射和域代碼與Foos屬性。所以NHibernate寫入漂亮的JSON到數據庫,而域可以使用便捷的列表而不會影響性能,因爲(de)序列化只發生在對象被加載/保存時發生。

3)有許多實踐驗證,有些更喜歡屬性,有些更喜歡每個域對象的驗證類。

我會用後者去,因爲它是最靈活的,你不會搞亂你的數據對象,你可以很容易地驗證整個對象。

屬性方式的一個搜索項是「數據註釋」。谷歌提出了這個結果,例如:http://stephenwalther.com/blog/archive/2008/09/10/asp-net-mvc-tip-43-use-data-annotation-validators.aspx

如果你做數據綁定,你可以看看IDataErrorInfo接口。

+0

感謝您的指導。我很高興我問。限制可以在屬性中分配的內容是否仍然有效? – dwerner 2011-04-04 21:19:04

+0

向您的setter添加驗證邏輯是完全有效的,但您應該考慮驗證技術的要求。通常情況下,您必須依賴其他人驗證屬性值(即startdate Zebi 2011-04-05 04:51:51