正式更正公共"常数"在C#中

时间:2016-01-05 13:43:17

标签: c# xamarin

我的C#项目中有一个常量类。我使用的是Constants类,其中包含用于配置OAuth登录调用的值。是否有人点击"使用Google登录"或"使用Facebook登录"等等定义了这些公共常量应该是什么值。

我是一名自学成才的程序员,所以可以看到我可能会在这里做一些可能导致问题的事情。那么你应该怎么做呢。

这是我目前所拥有的,但我希望只有APP_ID,其值将取决于按下了哪个登录按钮。

我可以在子程序中设置这些,但我不确定这是否是最佳做法?

public class Constants
{

    public const string FB_APP_ID = "xxxxxx";
    public const string FB_SCOPE = "";
    public const string FB_APP_NAME = "xxxx";
    public const string AUTH_URI = "https://m.facebook.com/dialog/oauth/";
    public const string RETURN_URI = "https://www.facebook.com/connect/login_success.html";

    public const string G_APP_ID = "yyyyyyy.apps.googleusercontent.com";
    public const string S_SCOPE = "https://www.googleapis.com/auth/userinfo.email";

}

更新

请注意关于我的设置的几点。我正在开发使用Xamarin进行跨平台移动开发,这不是非常相关。但是,它确实意味着我的解决方案有3个项目,一个可移植类库,一个iOS项目和一个Android项目。所以我在PCL的视图页面上描述了一些按钮,其后面有一些Button.Clicked个处理程序。这是我想设置全局OAuth详细信息类的值的地方。然后,我必须从iOS和Android项目中引用此OAuth实例,无论是Google,Facebook还是其他一组值。

3 个答案:

答案 0 :(得分:3)

你必须创建类,至少要保存数据,甚至可能为特定的提供者做一些自定义工作。

这样的事情:

public class OAuthInfo
{
    public string AppId {get;set;}
    public string Scope {get;set;}
    public string AppName  {get;set;}
    public string AuthUri {get;set;}
    public string ReturnUri  {get;set;}
}

实例化一个实例:

var facebookData = new OAuthInfo()
                   {
                       AppId = "xxxxxx",
                       Scope = "",
                       AppName  = "xxxx",
                       AuthUri = "https://m.facebook.com/dialog/oauth/",
                       ReturnUri  = "https://www.facebook.com/connect/login_success.html"
                   };

您可以将它传递到您需要的地方。

答案 1 :(得分:1)

创建一个app.config文件来保存这些所谓的常量。配置填充将随应用程序一起提交并在运行时读取。这样,如果需要,用户可以更改配置(?)而无需重新编译程序。

然后您可以将appSettings节点添加到app.config文件以保存所有应用程序值,这里是一个:

 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
    <appSettings>
       <add key="TargetURL" value="https://Omegacoder.Com" />
    </appSettings>
 </configuration/>

并提取(如果使用在Visual Studio 2015中找到的C#6,否则在代码中按名称ConfigurationManager设置属性并以此方式分配):

 public static string TargetUrl { get; set; } = 
                               ConfigurationManager.AppSettings["TargetURL"];

注意我将常量放入静态,但是您可以随时在程序中调用ConfigurationManger,而不必指定值,如图所示在我的例子中。

<强>更新

此时Xamarin项目不支持应用程序配置文件。

答案 2 :(得分:1)

继续我对配置的评论......

在典型的Windows / Web .NET应用程序中,您可以使用带有自定义配置部分的ConfigurationManager类来为您完成OAuth提供程序配置工作的大量工作。

这些课程缺少&#34;在Xamarin显然,在this thread的Xamarin论坛上有关于最佳实践的扩展讨论。

此主题可以概括为:

  • 如果您有环境配置更改,请将具有静态属性的静态类与#if编译器指令一起用于不同的环境部署。
  • 滚动您自己的XML配置文件,您可以使用标准的.NET XML处理(如Linq to XML)轻松读取和写入。

恕我直言,XML配置文件将是我的偏好,读者类是Singleton实现,就像ConfigurationManager一样。为什么?因为XML配置文件是.NET中已建立的模式,所以阅读代码的任何人都会理解你是如何/为什么以这种方式使用该类...

如果您将Singleton放在一个通常可访问的程序集中并确保它在构造中加载配置,它应该可以在多个位置使用,而不必担心重复代码或在第一次构造后重新生成该代码的生命周期应用程序,如果需要,只需向该程序集添加一个依赖项并使用该实例。