2017-06-23 18 views
3

どのようにしてstartup.csにデータを渡しますか?startup.csにデータを渡す

これは私がテスト・フィクスチャに応じて異なるデータを渡す必要WebHostBuilderTestServer

を使用して統合テストのためのものです。したがって、たとえば、設定ファイルからそれを引っ張っていけない

データがstartup.csに登録ミドルウェアに供給されます

ドキュメントが、これは動作するはず示唆しているようだ:

var configBuilder = new ConfigurationBuilder() 
       .AddInMemoryCollection(new[] 
       { 
        new KeyValuePair<string, string>("key", "value"), 
       }); 

      var configuration = configBuilder.Build(); 

      var host = new WebHostBuilder() 
       .UseKestrel() 
       .UseContentRoot(Directory.GetCurrentDirectory()) 
       .UseIISIntegration() 
       .UseConfiguration(configuration) // config added here 
       .UseStartup<Startup>() 
       .Build(); 

      host.Run(); 

しかし、startup.csのConfigurationオブジェクトを調べると、そのキーは存在しません。また、startup.csで定義されたプロバイダのみが利用可能です。私はコンセプトをテストするために、現時点でのProgram.csでこれを行うにしようとしています

、その後、私が間違ってやって後で

統合テストの任意のアイデアに移動しますか?

スタートアップにデータを渡すより良い方法はありますか?

+0

'Main'と' Startup'の設定はまったく違っていて、お互いには話しません。だからあなたがここで設定したものは、Webホストの設定だけです。しかし、 'Startup'にデータを送る方法は別です。あなたはコンストラクタや 'Configure'や他の場所でそれを望みますか? –

+0

私は特定のミドルウェアを設定したときに設定する必要がありますが、コンストラクタもうまくいくでしょう – ChrisCa

+0

'Main'に依存関係注入のための' Service'を実際に追加することはできますか?それが適切であれば、答えとして例を追加することができます。たとえば、必要なデータを含むシングルトンにすることができます。 –

答えて

1

Startupにデータを送信する1つの方法は、Mainにサービスを登録することです。 WebHostBuilderConfigureServicesメソッドを持っています。このメソッドは、メソッドのように、Startupクラスで実装できます。その後

たとえばあなたが静的変数(ない最高のアイデアはなく作品)を持つクラスを作ることができ

public class DataContainer 
{ 
    public static string Test; 
} 

は、その値を設定し、この後シングルトンサービスとして

DataContainer.Test = "testing"; 

var host = new WebHostBuilder() 
      .ConfigureServices(s => { s.AddSingleton(typeof(DataContainer)); }) 
      .UseKestrel() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .UseConfiguration(configuration) // config added here 
      .UseStartup<Startup>() 
      .Build(); 

を、それを追加するには、 Startupは、これを得るために通常の注入方法を使用できます。

public Startup(IHostingEnvironment env, DataContainer data) 
{ 
    // data.Test is available here and has the value that has been set in Main 
} 

もちろん、コンストラクタだけでなく、これ以降のどのクラスやメソッドでも動作します。

静的な値を持つクラスを実際に作成するよりも優れているかどうかはわかりませんが、クラスを変更する必要がある場合は、インターフェイスとその他の通常の注入のメリットがあります。

+0

ありがとう - それは動作します。単にクラスには静的なプロパティがないので、インスタンスを新しく作成しました。DataContainerコンテナ= new DataContainer {Test = "testing"};そして、次のように渡します:.ConfigureServices(s => {s.AddSingleton(container);}) – ChrisCa

+0

@ChrisCaおっと、忘れました。しかし、はい、それは実際に動作し、静的より優れています。 –

+0

もう一度ありがとうございます - これを行うための他の方法があるかどうかを確認するためにこれをしばらく開いておきますが、もしそうでなければこの答えを受け入れるでしょう - 歓声 – ChrisCa

関連する問題