2017-04-26 9 views
1

私はdotnet/c#のnewbiewで、勉強しようとしています。私は/ initを別のデータベースに接続するサーバーアプリケーションを書いています。 1つはMongoDBです。私は設定マイクロサービスを持っています。私は自分のconfig-serverから得た接続文字列をどうやって保存するのですか?これらのMongoDB exampleから、私は接続文字列を渡す必要があります。私は毎回config-serverから取得したくありません。.NETコアの起動時にデータベース接続を1回だけ設定する方法はありますか。

hereから依存性注入についてのチュートリアルを読むと、これが本当に必要なものかどうかはわかりません。私はから取得せずにConfigctlからMongoUrlを埋めたいゲッター/セッターとして

ここに私のトライアウトコードがある..私はセットアップや行為をしたい

私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毎回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:[email protected]:27017/admin"); 
    } 
} 

と実験のため、私はConfigureServicesからConfigctlを呼び出してみました。 I多分間違っ..

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

     services.AddMvc(); 
    } 

答えて

2

あなたは単に、アプリケーションの起動時にそれを読んでPOCOに結合し、シングルトンとしてPOCOを登録し、外部サービスからオプションを毎回読んでする必要がない場合。次に、依存関係としてPOCOをMongdbContextに渡します。

オプションリーダー例:起動クラスで

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

サービス登録:

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) 
    { 
    } 
} 
+0

これは幻想的できれいに見えます。私は今これを試してみるつもりです。 – Hokutosei

+0

これは多くの助けてくれてありがとう。ありがとうございました :) – Hokutosei

関連する問題