我已经编写了一个围绕C#Facebook SDK的包装器,使用以下代码:
public interface IFacebookService
{
Uri GetLoginUri(string returnUrl);
FacebookResult OAuth(string url, string code);
void Post(string message, string accessToken);
}
实现如下:
public class FacebookService : IFacebookService
{
public Uri GetLoginUri(string returnUrl)
{
var oAuthClient = new FacebookOAuthClient(FacebookApplication.Current);
// code removed for simplicity
return uri;
}
public FacebookResult OAuth(string url, string code)
{
FacebookOAuthResult oauthResult;
if (FacebookOAuthResult.TryParse(url, out oauthResult))
{
// code removed for simplicity
}
return result;
}
public void Post(string message, string accessToken)
{
var client = new FacebookClient(accessToken);
// code removed for simplicity
}
}
我使用Ninject将其注入需要使用oauth执行登录并将其发布到用户Facebook墙。
我目前使用以下配置:
kernel.Bind<IFacebookService>().To<FacebookService>().InSingletonScope();
使用InSingletonScope是否正确?由于这是第三方库,我不确定这是否是正确的方法,因为所有线程都将共享该实例。
答案 0 :(得分:0)
我不了解Facebook SDK。但作为一般规则,如果实现是无状态的,则单例是正确的范围。我假设你的实现就是这种情况。
答案 1 :(得分:0)
我认为没有必要创建一个新界面来处理FacebookOAuthClient.GetLoginUrl或FacebookOAuthResult.Parse
FacebookOAuthClient的GetLoginUrl和ParseResult已经是虚拟的。 (确保你至少在v5.0.35上获得与FacebookOAuthResult.Parse相同的FacebookOAuthClient.ParseResult。)
然后使用构造函数注入ninject为FacebookOAuthClient设置IFacebookApplication。
您还可以使用构造函数注入来为FacebookClient设置访问令牌。 (除非你想要更简单的方法发布到墙上等等。) 或者您也可以不使用访问令牌,并设置FacebookClient.AccessToken =“access_token”