Я использовал синглтон для своего класса утилит Facebook, и поэтому я позволил себе только два: синглтон веб-контекста и синглтон контекста приложения.
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");
Это поддерживает интерфейс чистым, и я неу меня нет никаких избыточных методов.Если метод недоступен в контексте приложения, я выбрасываю исключение, которое не идеально, но на данный момент оно соответствует моим целям.Прабир, как ты относишься к этому подходу?