几乎每个项目都有一些预定义的设置值,这些值将在整个应用程序中使用,因此建议将它们加载一次然后在各处使用的推荐方式是什么?
例如,我做了一个项目,其中一些设置存储在数据库中,整个应用程序都可以访问这些设置。我不是每次都查询它们,而是将所有内容加载到静态类中,然后在整个应用程序中使用它。您还使用其他什么方法?
答案 0 :(得分:1)
如果您有一个从数据库检索设置的类:
public class SqlSettingsProvider : ISettingsProvider
{
private readonly string _connectionString;
public SqlSettingsProvider(string connectionString)
{
_connectionString = connectionString;
}
public Settings GetSettings()
{
// load the settings from SQL
}
}
您可以在ServiceCollection
上注册该课程:
var connectionString = "xyz"; // load this from config;
services.AddSingleton<SqlSettingsProvider>(provider =>
new SqlSettingsProvider(connectionString));
(您可能有一个类似ISettingsProvider
的界面,但是在此示例中不需要,因为您将注入Settings
,而不是设置提供程序。)
然后,通过解析Settings
并使用它来检索SqlSettingsProvider
的实例,将服务集合配置为解析Settings
。
services.AddSingleton<Settings>(provider =>
provider.GetService<SqlSettingsProvider>().GetSettings());
现在,无论您需要什么地方Settings
,只需注入它们:
public class SomeControllerOrOtherClass
{
private readonly Settings _settings;
public SomeControllerOrOtherClass(Settings settings)
{
_settings = settings;
}
}
现在,您的课程可以只依赖Settings
而不管它来自何处。服务集合只会创建一次,然后每次都返回相同的实例,这意味着只能从数据库中查找一次。
注入ISettingsProvider
之类的接口可能会有一些长期利益。这为您提供了更多的灵活性。例如,不是在应用程序的生存期内存储Settings
,而是可以在指定的持续时间内对其进行缓存,或者以其他某种方式表现不同。