2010-04-15 44 views
0

嗨,我一直在尋找一個解決方案來解決我們的代碼庫的棘手問題。C#嵌套屬性訪問重載或順序操作符重載

要開始,我們的代碼如下所示:

class User 
{ 
    int id; 
    int accountId; 

    Account account 
    { 
    get { return Account.Get(accountId); } 
    }  
} 

class Account 
{ 
    int accountId; 
    OnlinePresence Presence 
    { 
     get { return OnlinePresence.Get(accountId); } 
    } 
    public static Account Get(int accountId) 
    { 
     // hits a database and gets back our object. 
    } 
} 

class OnlinePresence 
{ 
    int accountId; 
    bool isOnline; 
    public static OnlinePresence Get(int accountId) 
    { 
     // hits a database and gets back our object. 
    } 
} 

我們現在經常做的我們的代碼是試圖做

var presence = user.Account.Presence; 

問題訪問用戶的帳戶存在這是因爲這實際上是向數據庫發出兩個請求。一個獲取Account對象,然後一個獲取Presence對象。我們可以很容易地敲下來到一個請求,如果我們做了以下內容:

var presence = UserPresence.Get(user.id); 

這個工作,但那種要求開發人員具有的UserPresence類/方法將是很好消除的理解。

我想到了一些很酷的方法可以處理這個問題,並想知道是否有人知道這些是否可能,如果還有其他方式來處理這個問題,或者我們只需要考慮更多因爲我們正在編碼並執行UserPresence.Get而不是使用屬性。

  1. 重載嵌套訪問器。 如果在User類內部,我可以編寫某種「擴展」,它會說「任何時候用戶對象的Account屬性的Presence對象被訪問,而不是這個」,這將是很酷的。

  2. 重載。操作人員瞭解後續內容。 如果我能以某種方式超載。只有在右邊的對象也被「加點」的情況下,操作員纔會很棒。

這兩個看起來都像是可以在編譯時處理的事情,但也許我錯過了一些東西(反射會使它難嗎?)。我是否完全錯誤地看待事物?有沒有強制執行這種方法來消除業務邏輯用戶的負擔?

謝謝! 添

回答

0

爲什麼不Repository模式去有以下幾點:

public class UserPresenceRepository 
{ 
    public UserPresenceRepository(string connString) 
    { 
     // configure db properties 
    } 

    public UserPresence GetPresence(User user) 
    { 
     // get precense from user.accountId if possible 
     // and skip the trip for Account 
    } 
} 

所以調用代碼看起來像:

UserPresenceRepository repo = new UserPresenceRepository(connString); 
repo.GetPresence(user); 

最終的結果是一個存儲庫的明確定義如果您需要用戶存在信息,請致電。 GetPresence方法也清楚地運行在User對象上,而不是要求開發人員知道要通過哪個ID。

此處的其他選項將停止延遲加載對象。這樣,您可以將所需的所有內容加載到數據庫中,並準備就緒。

0

認爲它更好的代理模式。

class User 
{ 
    int id; 
    int accountId; 

    Account Account 
    { 
     get { return new ProxyAccount(accountId); } 
    } 
} 

abstract class Account 
{ 
    protected int accountId; 

    protected Account(int accountId) 
    { 
     this.accountId = accountId; 
    } 

    public OnlinePresence Presence 
    { 
     get { return new ProxyOnlinePresence(accountId); } 
    } 

    /* 
     other properties of the Account go here as abstract properties 

     public abstract string SomeProperty { get; set; } 

    */ 

    public static Account Get(int accountId) 
    { 
     // hits a database and returns an instance of DBAccount. 
    } 
} 

class ProxyAccount : Account 
{ 
    private Account account; 
    public ProxyAccount(int accountId) : base(accountId) 
    { 
    } 

    private Account GetAccount() 
    { 
     if (account == null) 
      account = Account.Get(accountId); 
     return account; 
    } 

    /* 
     Accounts abstract properties are implemented here 

     public override string SomeProperty 
     { 
      get { return GetAccount().SomeProperty; } 
      set { GetAccount().SomeProperty = value; } 
     } 
    */ 
} 

class DBAccount : Account 
{ 
    public DBAccount(int accountId) : base(accountId) 
    { 
    } 

    /* 
     Accounts abstract properties are implemented here 

     public override string SomeProperty { get; set; } 
    */ 
} 

我剛纔給你看的方式只與Account類,但你也有OnlinePresence做的一樣好(你可以看到,我假設你有一個ProxyOnlinePresence類)。