【问题标题】:How to setup database connections only once from startup in .NET Core?如何从 .NET Core 启动时只设置一次数据库连接?
【发布时间】:2017-04-26 08:37:07
【问题描述】:

我是 dotnet/c# 的新手,正在努力学习。我正在编写一个连接/初始化到不同数据库的服务器应用程序。一个是 MongoDB。然后我有一个配置微服务。如何保存从配置服务器获得的连接字符串?从这些MongoDB example,我需要传递连接字符串。但我不想每次都从配置服务器获取它。

阅读here 的一些关于依赖注入的教程,不确定这是否真的是我需要的。

这是我的试用代码..

我想要设置或充当 getter/setter 的配置服务

public class Configctl : IDisposable
{
    public static string env;
    public Configctl()
    {
        env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
        Console.WriteLine($"ASPNETCORE_ENVIRONMENT/env={env}");
    }

    public static void ConfigureMongodb()
    {
        Console.WriteLine($"configure mongodb..");
        // var config = await getConfig()
    }
}

MongdbContext 表示我想从Configctl 中填写MongoUrl,而不是每次都从Configctl 中获取。

public class MongdbContext<T> : IDisposable
{
    public IMongoDatabase _database { get; }
    public IMongoClient _client;
    public MongdbContext()
    {
        var settings = MongoClientSettings.FromUrl(GetMongoURL());
        _client = new MongoClient(settings);
        _database = _client.GetDatabase("testdb");
    }

    public void Dispose()
    {
        Console.WriteLine("mongodb disposed");
    }

    public static MongoUrl GetMongoURL()
    {
        return new MongoUrl("mongodb://user:pass@host:27017/admin");
    }
}

为了实验,我尝试从ConfigureServices 调用Configctl。我可能错了..

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton(new Configctl());

        services.AddMvc();
    }

【问题讨论】:

    标签: c# mongodb .net-core


    【解决方案1】:

    如果您不需要每次都从外部服务读取选项,那么只需在应用程序启动时读取它,绑定到 POCO 并将 POCO 注册为单例。然后将 POCO 作为依赖项传递给您的 MongdbContext

    选项阅读器示例:

    class OptionsReader
    {
        public MyOptions GetMyOptions()
        {
             //call to external config microservice, db, etc.
        }
    }
    

    Startup 类中的服务注册:

    public void ConfigureServices(IServiceCollection services)
    {    
        services.AddTransient<OptionsReader>();
        services.AddSingletonFromService<OptionsReader, MyOptions>(x => x.GetMyOptions());
    }
    

    有用的扩展方法:

    public static void AddSingletonFromService<TService, TOptions>(
        this IServiceCollection services,
        Func<TService, TOptions> getOptions)
        where TOptions : class
        where TService : class
    {
        services.AddSingleton(provider =>
        {
            var service = provider.GetService<TService>();
    
            TOptions options = getOptions(service);
    
            return options;
        });
    }
    

    选项消费者:

    class MongdbContext
    {
        public MongdbContext(MyOptions options)
        {
        }
    }
    

    【讨论】:

    • 这看起来很棒而且很干净。我现在要试试这个。谢谢
    猜你喜欢
    • 2017-05-18
    • 2017-09-01
    • 2016-01-02
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多