在3层控制台应用程序中使用常量或全局变量

时间:2013-04-16 19:58:20

标签: c#

我有一个3层应用程序设置,就像控制台表示层一样。在我的业务逻辑中,我有一个类,我声明了一些固定的不同变量,即值不会改变。这些变量的值取自应用程序设置。

现在我发现的问题是我的类调用了不同的方法,这些方法通过方法签名传递这些变量。这是好习惯吗?如果没有,那么使用常数会不会更好?如果是这样,常量应该在哪里生存,以便我可以在需要它的地方访问它们而不是传递变量?

修改

为你们添加一些代码。所以他们是我在这里提到的全局变量。

好的,在我的控制台应用程序(演示文稿)中,我目前有类似的东西:

public class Program
{
    public static void Main(string[] args)
    {
        MainClass myClass = new MainClass(appSetting1, appSetting2, appSetting3);
    }
}

然后在MainClass中我有:

public class MainClass
{
    private string _appSetting1 = string.Empty;
    private string _appSetting2 = string.Empty;
    private string _appSetting3 = string.Empty;

    public MainClass(string appSetting1, string appSetting2, string appSetting3)
    {
        _appSetting1 = appSetting1;
        _appSetting2 = appSetting2;
        _appSetting3 = appSetting3;
    }

    public void MyMethod()
    {
        Method2(_appSetting1, _appSetting2);
        Method3(_appSetting2, _appSetting3);
        Method4(_appSetting1, _appSetting3);
    }
}

我希望你能明白我的意思。我发现自己在多个方法中传递全局变量。我只是觉得有一种更简单的方法可以做到这一点?比如创建一个常量类或类似的东西?我不能100%确定最佳方法。

在我的MainClass中,我可以像这样声明我的全局变量:

    private string _appSetting1 = ConfigurationManager.AppSettings["appsetting1"];
    private string _appSetting2 = ConfigurationManager.AppSettings["appsetting2"];
    private string _appSetting3 = ConfigurationManager.AppSettings["appsetting3"];

但我真的想在我的业务逻辑中这样做吗?

3 个答案:

答案 0 :(得分:1)

如果它们在app.config中并且不应该更改,则应始终从那里引用它们,而不是将它们作为参数传递。这样,您的意图是静态值在代码中是清楚的。

修改

在这种情况下,吉姆的回答是有道理的。它真的只是一个简短的手,所以而不是编写ConfigurationManager.AppSettings [“appsetting1”];您使用Settings.AppSetting1。无论哪种方式,如果你将每个类的顶层声明为类级变量,你会重复自己。我喜欢Jim的答案比我的好,尽管你可以扩展它。我将所有配置保存在db中,然后使用在私有实例构造函数中具有proc调用的单例来加载配置。 Jim的回答可以在以后实现,而无需更改您的调用代码。通常配置文件很痛苦。

答案 1 :(得分:1)

我是无配置的心态。

如果这些事情可能没有改变,那么就有一个项目可以引用的程序集返回值。

我回避配置文件。我意识到在部署环境中需要它们,但鉴于您的要求,我建议使用一个公共类库, else 可以使用和引用。

如果你必须改变一些假设不变的东西,你可以在一个地方改变它。

答案 2 :(得分:1)

另一种可能性是创建一个Settings类来加载它们并将它们公开为public readonly。这对我来说效果很好:

public class Settings
{
    public static readonly string AppSetting1;
    public static readonly string AppSetting2;
    public static readonly string AppSetting3;

    static Settings()
    {
        AppSetting1 = ConfigurationManager.AppSettings["appsetting1"];
        AppSetting2 = ConfigurationManager.AppSettings["appsetting2"];
        AppSetting3 = ConfigurationManager.AppSettings["appsetting3"];
    }
}

在第一次访问任何变量之前,会自动调用静态构造函数,因此您不必显式调用它。您的程序可以访问Settings.AppSetting1等变量