2

我已经使用 Facebook C# SDK 启动并运行了我的 ASP.NET MVC 3 Web 应用程序。

按照此处的说明,似乎一旦您在指示的 web 配置部分中输入了 AppId / Secret,这就是使用时拉回的设置FacebookApplication.Current,例如:

var oAuthClient = new FacebookOAuthClient(FacebookApplication.Current) 
{
   RedirectUri = new Uri(RedirectUrl)
};

我的 Web 应用程序是“白标”的,因此它为两个网站提供服务,并带有两个单独的 Facebook 应用程序。

以前当我实现 Facebook Connect 时,我有一个名为“FacebookApplicationId”的全局属性,它查看域并计算出要使用的应用程序 ID。

有没有一种优雅的方式来使用 Facebook C# SDK 做到这一点?

我可以这样做:

var oAuthClient = new FacebookOAuthClient(FacebookApplication.Current) 
{
     RedirectUri = new Uri(RedirectUrl),
     AppId = ManuallyGetTheRightAppIdBasedOnDomain(),
     AppSecret = ManuallyGetTheRightAppSecretBasedOnDomain()
};

但这似乎不干燥,因为我必须继续这样做。

有没有办法我可以把一些聪明的东西放进去FacebookApplication.Current,这样AppIdandAppSecret属性就已经设置好了?

接受任何和所有建议。

4

1 回答 1

1

我想我明白了: ctor forFacebookOAuthClient需要一个IFacebookApplication.

所以我创建了一个名为 的具体实现WhiteLabeledFacebookApplication,它实现了IFacebookApplication.

WhiteLabeledFacebookApplication的 ctor 接受一个WebsiteType枚举,因此基于在 ctor 中传递的枚举的属性AppId和从 web.config 读取相关值。AppSecret

所以,在我的FacebookController,(我做所有 FB 的东西),我有一个私有财产,叫做CurrentFacebookApplication

private IFacebookApplication _currentFacebookApplication;
private IFacebookApplication CurrentFacebookApplication
{
   get
   {
      if (_currentFacebookApplication == null)
      {
         var websiteType = SomeUnimportantCodeWhichWorksOutWebsiteFromUrl();
         _currentFacebookApplication = new WhiteLabeledFacebookApplication(websiteType );
      }

      return _currentFacebookApplication;
   }
}

所以我可以这样做:

var oAuthClient = new FacebookOAuthClient(CurrentFacebookApplication) 
{
   RedirectUri = new Uri(RedirectUrl)
};

并且正确的 AppId/Secret 将被拉回 - 太棒了!

我唯一希望我能做的就是使用依赖注入,但是在构建控制器期间,没有HttpContext,所以我无法确定网站类型。

尽管如此,效果很好 - 相当干燥。

向使用接口驱动编程的工具包的开发人员致敬。

于 2011-03-31T04:07:29.700 回答