2010-07-02 55 views
3

我工作在C#中的一些項目,我碰到下面的問題就來了:數據管理 - 只讀數據

我有一些數據類型的類,例如Person類,這使有關信息人。

另外,我有一個DataManager類,它負責管理我的程序中的人員。如果你想添加,獲取,查找或刪除一個人,你只能通過DataManager類來完成。

問題是我不希望除了DataManager類以外的任何人能夠改變Person對象。例如,如果有人打電話給DataManager.getPerson(int ID),他們將得到一個Person對象,並且能夠使用該Person對象的setter函數來更改其內容(名,姓,ID等)。

我想避免這種情況。我只想要DataManager類能夠更改Person對象(通過諸如DataManager.changeFirstNameForPerson(int ID, string name)等方法)。

什麼是最好的類結構可以實現這一目標?

回答

2

那麼,你永遠無法阻止人們改變數值100%。他們總是可以經歷反思。

但是,從API的角度來看,您可以使Person類的所有getter都是公開的,並且可以讓所有setter的內部公開。只要Person和DataManager類在同一個程序集中,DataManager就可以很好地訪問setter,但其他引用程序集的應用程序卻不能。

public class Person 
{ 
    public string Fname { get; internal set; } 
} 


public class DataManager 
{ 
    public void ChangeNameForPerson(int id, string fname) 
    { 
     Person p = Person.GetById(id); 
     // Inside the same assembly. Setter is accessible 
     p.Fname = fname; 
    } 
} 

組裝之外,你有這樣的:

Person p = DataManager.GetPerson(1); 
p.Fname = "asdf"; // Compile time error 
DataManager.ChangeNameForPerson(1, "asdf"); // Works fine 
1

涌現在腦海的第一個兩兩件事是:

1 - 使人屬性設置器的保護,有DataManager的從人

獲得

2 - 使人屬性設置器內,把人與DataManager的在自己的程序集中

0

使Person類不可變;也就是使其上的所有字段readonly只提供屬性獲取者,而不提供設置者。將所有字段的值傳遞給構造函數。

+0

不知道爲什麼這了下來投票? – 2010-07-02 18:26:37

1

如果使用internal關鍵字在Person類中聲明get/set訪問器,則只有同一個程序集中的對象才能訪問它們。只要將DataManager類包含在同一個程序集中,它就可以訪問,程序集外的任何代碼都不會。

-1

一種選擇是重構現有Person類是一個內部類的DataManager(即DataManager.Person),然後創建沿線的一個新的Person類:

public class Person 
{ 
    private DataManager.Person person; 

    public Person(Datamanager.Person person) 
    { 
     this.person = person 
    } 

    public int ID 
    { 
     get { return person.ID; } 
    } 

    ... 
} 

然後,在你的DataManager類,你會做一些事情,如:

public Person GetPerson(int id) 
{ 
    DataManager.Person person = // get the person by ID 
    return new Person(person); 
} 

現在外部代碼訪問只讀Person類,但沒有辦法去讀取參考/寫DataManager.Person。