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

C# 在3层控制台应用程序中使用常量或全局变量,c#,C#,我有一个3层的应用程序设置,比如控制台表示层。在我的业务逻辑中,我有一个类,我在其中声明了许多不同的变量,这些变量是固定的,即值不会改变。这些变量的值取自应用程序设置 现在我发现的问题是,我的类调用了不同的方法,其中这些变量通过方法签名传递。这是好的做法吗?如果不是,使用常量不是更好吗?如果是这样的话,常量应该存在于哪里,这样我就可以在需要它们的地方访问它们,而不是传递变量 编辑 为你们添加一些代码。所以这里我指的是全局变量 好的,在我的控制台应用程序(演示文稿)中,我目前有如下内容: publ

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

现在我发现的问题是,我的类调用了不同的方法,其中这些变量通过方法签名传递。这是好的做法吗?如果不是,使用常量不是更好吗?如果是这样的话,常量应该存在于哪里,这样我就可以在需要它们的地方访问它们,而不是传递变量

编辑

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

好的,在我的控制台应用程序(演示文稿)中,我目前有如下内容:

public class Program
{
    public static void Main(string[] args)
    {
        MainClass myClass = new MainClass(appSetting1, appSetting2, appSetting3);
    }
}
    private string _appSetting1 = ConfigurationManager.AppSettings["appsetting1"];
    private string _appSetting2 = ConfigurationManager.AppSettings["appsetting2"];
    private string _appSetting3 = ConfigurationManager.AppSettings["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);
    }
}
我希望你能明白我的意思。我发现自己在多个方法中传递全局变量。我只是觉得有更简单的方法?比如创建一个constants类,或者在上面的行中创建什么?我不是100%确定最好的方法

在main类中,我可以这样声明全局变量:

public class Program
{
    public static void Main(string[] args)
    {
        MainClass myClass = new MainClass(appSetting1, appSetting2, appSetting3);
    }
}
    private string _appSetting1 = ConfigurationManager.AppSettings["appsetting1"];
    private string _appSetting2 = ConfigurationManager.AppSettings["appsetting2"];
    private string _appSetting3 = ConfigurationManager.AppSettings["appsetting3"];

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

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

编辑


吉姆的回答在这种情况下是有道理的。这实际上只是一个简单的操作,所以没有编写ConfigurationManager.AppSettings[“appsetting1”];您可以使用Settings.AppSetting1。无论哪种方式,如果在每个类的顶部将它们声明为类级变量,都会重复您自己。我更喜欢吉姆的答案,因为你可以扩展它。我将所有配置保存在数据库中,然后使用一个在私有实例构造函数中具有proc调用的单例来加载配置。Jims answer可以在以后实现,而无需更改调用代码。一般来说,配置文件是一件痛苦的事情。

我的心态是无配置的

如果这些东西大概不会改变,那么就有一个程序集,项目可以引用该程序集并返回值

我回避配置文件。我意识到它们在部署环境中是需要的,但考虑到您的需求,我建议使用一个通用类库,其他所有东西都可以使用和引用


如果您确实必须更改假定为常量的内容,您可以在一个位置更改它。

另一种可能性是创建一个
设置
类,加载它们并将它们公开为
公共只读
。这在过去对我很有效:

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"];
    }
}

静态构造函数是在首次访问任何变量之前自动调用的,因此您不必显式调用它。您的程序可以通过
设置访问变量。AppSetting1
等。

显示一些相关代码。否则全是猜测。我指的是数据和它使用的方法。请给我们看一些代码。你是什么意思?将变量作为参数传入是否是“良好做法”?如果它是一个全局常数,就不用麻烦了。在一个单独的类中定义它们,
常量
,并通过调用它来获取它们的值。你是指常量还是全局变量?大家好,我已经编辑了上面的文章,所以你们有一些代码可以看。谢谢Jules。好的,所以我唯一的问题是如果我需要在不同的类中使用应用程序设置。假设我有3个类需要使用appSetting1、appSetting2和appSetting3。我需要在顶部向全球宣布这些。好像我在重复我自己,仅此而已。你认为呢?吉姆的回答在这种情况下是有道理的。这实际上只是一个简单的操作,所以没有编写ConfigurationManager.AppSettings[“appsetting1”];您可以使用Seettings.ApSetting1。无论哪种方式,如果你在每个类的顶部将它们声明为类级变量,你都会重复你自己。我只有大约5个应用程序设置。一个专门用于此的新类库不是有点过分吗?谢谢Jim。那么这个设置类应该住在哪里呢?在我的业务层?