Как настроить подключения к базе данных только один раз при запуске в.NET Core?

Я новичок в dotnet/ C# и пытаюсь учиться. Я пишу серверное приложение, которое подключает /init к другой базе данных. один - MongoDB. тогда у меня есть конфиг микросервис. как сохранить строку подключения, полученную с моего config-сервера? из этого примера MongoDB мне нужно передать строку подключения. но я не хочу получать его с сервера конфигурации каждый раз.

Прочитайте некоторые уроки здесь о внедрении зависимостей, не уверен, действительно ли это то, что мне нужно.

Вот мой пробный код..

мой configservice, который я хочу настроить или действовать как получатель / установщик

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 что я хочу заполнить MongoUrl от Configctl не получая от 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");
    }
}

и для эксперимента я попытался позвонить Configctl от ConfigureServices, Может я ошибаюсь..

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

        services.AddMvc();
    }

1 ответ

Решение

Если вам не нужно каждый раз читать опции из внешнего сервиса, просто прочитайте его при запуске приложения, привяжите к POCO и зарегистрируйте POCO как singleton. Затем передайте 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)
    {
    }
}
Другие вопросы по тегам