2011-08-09 8 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のユーティリティを切り離そうとしており、私はこのようなことを避けようとしています: 'public bool GetUserFromSession()'と 'public bool GetUserFromApp()'私にはかなり冗長です。ビジネスロジックがそれについて知ってはならないので、私はパラメータとしてFacebookClientを渡したくありません。私は以下のまともなソリューションを思いついたと思いますが、あなたが正しいです、私は明示的に使用するアクセストークンを選択する必要があります。 – dcpar

答えて

0

私はFacebookのユーティリティクラスにシングルトンを使用していたので、2つだけ許可しました:ウェブコンテキストシングルトンとアプリコンテキストシングルトン。

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、このアプローチについてどう思いますか?

関連する問題