我有一个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"];
但我真的想在我的业务逻辑中这样做吗?
答案 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
等变量