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