2016-07-08 58 views
0

我使用Fluent-NHibernate来管理所有的数据持久层,并且我总体非常满意(并感谢NHibernate社区)。我打算继续使用OR映射器。我围绕正在映射的POCO开发了一个API。缺点是所有的属性都可以由UI开发人员获取和设置;当我真正想要的是隐藏非中间层开发的属性,并只显示提供的API方法来执行操作。在使用OR映射器时隐藏属性设置器

有没有人有这个好策略?

过于简单的例子:

member.FName = "Julian"; /// Don't do this because it avoids the my checking 
member.LName = "King"; 


member.setName("Julian", "King"); /// Yes - this will throw an error if this person already exist 
+0

什么是公众制定者和公众的操作有什么区别?两者都产生相同的结果。也许你想让你的类型_immutable_来代替? – MickyD

+0

按操作你是指方法吗?你建议使用方法而不是属性? – Juls

+0

是的。不,这听起来像你想要不可变的类型,在这种情况下,你会把所有东西都传递给构造函数。因此,将不存在改变状态的设置者或方法。 – MickyD

回答

1
private string _fName; 
public string FName 
{ 
    get { return _fName;} 
} 

private string _lName; 
public string LName 
{ 
    get { return _lName;} 
} 

public void SetName(string fName, string lName){ 

    // check for nulls here and or validate pre-conditions 

    _fName = fName; 
    _ lName = lName; 

// check for post conditions here 

} 

或者更好的使用值对象(见值对象的定义DDD)

public void SetName(Name name){ 

     _fName = name.FirstName; 
     _ lName = name.LastName; 

    } 
+0

谢谢你的回应。你是正确的,这将保护数据属性并强制使用函数来设置Name。然而,也许我没有说清楚,我使用的是OR映射器Fluent NHibernate,所以根本没有私钥或者根本没有setter会抛出映射错误。 – Juls

+0

你可能想更多地阅读NH。您可以映射到专用字段列。我一直这样做。 – epitka

+0

你甚至可以将它指定为所有类别的对话或逐个案例。 DefaultAccess.ReadOnlyPropertyThroughCamelCaseField(CamelCasePrefix.Underscore); – epitka