2

我有一个带有控制台表示层的 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"];

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

4

3 回答 3

1

Another possibility is to create a Settings class that loads them and exposes them as public readonly. This has worked well for me in the past:

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

The static constructor is called automatically before the first access to any of the variables, so you don't have to call it explicitly. Your program can access the variables as Settings.AppSetting1, etc.

于 2013-04-16T21:11:06.280 回答
1

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

编辑

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

于 2013-04-16T20:03:07.287 回答
1

我是无配置的心态。

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

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

如果您确实必须更改一些假定不变的内容,您可以在一个地方进行更改。

于 2013-04-16T20:11:36.290 回答