Как настроить подключения к базе данных только один раз при запуске в.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)
{
}
}