我想在NHibernate映射对象中执行此操作:
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)在执行验证方面,这是否违反了最佳做法?我希望在这个类中嵌入特定于对象的行为。
答案 0 :(得分: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写入数据库,而域可以使用方便的List而不会影响性能,因为(de)序列化仅在加载/保存对象时发生。
3)有许多实践要验证,有些更喜欢属性,有些更喜欢每个域对象的验证类。
我会选择后者,因为它最灵活,你不会弄乱你的数据对象,你可以轻松验证整个对象。
属性方式的一个搜索词是“数据注释”。谷歌提出了这个结果,例如:http://stephenwalther.com/blog/archive/2008/09/10/asp-net-mvc-tip-43-use-data-annotation-validators.aspx
如果您进行数据绑定,可以查看IDataErrorInfo
界面。