建议向应用程序各处的用户一次加载数据的推荐方法是什么?

时间:2018-07-02 19:11:20

标签: c# asp.net-core asp.net-core-2.0

几乎每个项目都有一些预定义的设置值,这些值将在整个应用程序中使用,因此建议将它们加载一次然后在各处使用的推荐方式是什么?

例如,我做了一个项目,其中一些设置存储在数据库中,整个应用程序都可以访问这些设置。我不是每次都查询它们,而是将所有内容加载到静态类中,然后在整个应用程序中使用它。您还使用其他什么方法?

1 个答案:

答案 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,而是可以在指定的持续时间内对其进行缓存,或者以其他某种方式表现不同。