2011-08-09 36 views
0

我希望能夠使用一些相同的方法,我是否正在使用一個應用程序的身份驗證令牌或用戶身份驗證令牌,並且需要測試,以確定我什麼背景下在類似於以下內容:確定應用程序或會話背景

public FacebookClient GetFacebookClient() { 
     return IsUserRequest() ? GetFacebookWebClient() : GetFacebookAppClient(); 
    } 
    public dynamic GetUser(long fbId) { 
     var fbClient = GetFacebookClient(); 
     return fbClient.Query(String.Format(@"SELECT uid,name FROM user WHERE uid = ({0})", fbId); 
    } 

但是,我似乎無法找到一個很好的測試來實現IsUserRequest()。有任何想法嗎?

+0

有IsUserRequest()來自動將不會是一個好主意。如果您明確告知要使用哪個訪問令牌(用戶或應用程序),則會更好。 – prabir

+0

這個問題是這樣的:我試圖從業務邏輯中分離出Facebook的事業,我試圖避免做這樣的事情: '公佈爾GetUserFromSession()'和'公佈爾GetUserFromApp()',這似乎對我來說相當多餘。我也不想傳入FacebookClient作爲參數,因爲業務邏輯不應該知道這一點。我想我已經在下面提出了一個體面的解決方案,而且你是對的,我應該明確地選擇使用哪個訪問令牌。 – dcpar

回答

0

我使用的是單爲我的Facebook公用事業類,所以我只允許有兩個:一個Web上下文單身,和一個應用程序上下文單。

public class FbUtil { 
    private static readonly FbUtil webInstance = new FbUtil(false); 
    private static readonly FbUtil appInstance = new FbUtil(true); 
    static FbUtil() {} 
    private FbUtil(bool isAppInstance) { 
     IsAppInstance = isAppInstance; 
    } 
    private readonly bool IsAppInstance; 
    public static FbUtil WebInstance { 
     get { return webInstance; } 
    } 
    public static FbUtil AppInstance { 
     get { return appInstance; } 
    } 
    public FacebookClient GetFacebookAppClient() { 
     var oauth = new FacebookOAuthClient { AppId=Config.FacebookConfig.AppId, AppSecret=Config.FacebookConfig.AppSecret }; 
     dynamic tokenRes = oauth.GetApplicationAccessToken(); 
     return new FacebookClient(tokenRes.access_token);   
    } 
    public FacebookClient GetFacebookWebClient() { 
     return new FacebookWebClient();   
    } 
    public FacebookClient GetFacebookClient() { 
     return IsAppInstance ? GetFacebookAppClient() : GetFacebookWebClient(); 
    } 
    public FbUser GetUser(long facebookId) {   
     var client = GetFacebookClient(); 
     dynamic result = client.Get(facebookId); 
     return new FbUser(result); 
    } 
    ... etc. other FB utility methods 
} 

和我簡單地調用它像這樣從我的業務對象:

var fbUser = FbUtil.WebInstance.GetUser("12345"); 

var fbUser = FbUtil.AppInstance.GetUser("12345");  

這樣可以使界面乾淨,和我沒有任何多餘的方法。如果一個方法在應用上下文中不可用,我會拋出一個異常,這並不理想,但它現在適合我的目的。 prabir,你對這種方法有什麼感覺?