确定应用程序或会话上下文

时间:2011-08-09 06:41:37

标签: facebook-c#-sdk

我希望能够使用一些相同的方法,无论我是否使用app auth令牌或用户身份验证令牌,并且需要测试来确定我在哪个上下文。类似于以下内容:

    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()。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我在我的Facebook实用程序类中使用单例,所以我只允许两个:web上下文单例和app上下文单例。

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");    

这样可以保持界面清洁,而且我没有任何冗余方法。如果某个方法在app上下文中无法使用,我会抛出一个异常,这是不理想的,但它现在适合我的目的。 prabir,你觉得这种做法怎么样?