2016-04-27 3 views
2

私の具体的なクラスの1つです。私は方法を持っています。1.0.0-rc1-finalのappsettings.jsonから値を読み取る

public class Call : ICall 
{ 
    ...... 
    public Task<HttpResponseMessage> GetHttpResponseMessageFromDeviceAndDataService() 
    { 
     var client = new HttpClient(); 
     var uri = new Uri("http://localhost:30151"); 
     var response = GetAsyncHttpResponseMessage(client, uri); 
     return response; 
    } 

私はappsettings.jsonにURLを入れました。

{ 
    "AppSettings": { 
     "uri": "http://localhost:30151" 
    } 
} 

そして私はStartup.cs

public class Startup 
{ 
    public IConfiguration Configuration { get; set; } 
    public Startup(IHostingEnvironment env) 
    { 
     var builder = new ConfigurationBuilder() 
      .AddJsonFile("appsettings.json"); 

     Configuration = builder.Build(); 
    } 
} 

、今、私は立ち往生を作成しました。ところで

EDIT

、私はコントローラを持っていない、それはコンソールアプリケーションです。

答えて

3

appSettings.jsonから設定を読み込むための好ましい方法は、依存性注入を使用して構築されたいどこにでも設定にアクセスまたは(または第三者の)IoCコンテナ。必要なのは、設定セクションをConfigureメソッドに渡すだけです。

public class AppSettings 
{ 
    public int NoRooms { get; set; } 
    public string Uri { get; set; } 
} 

services.Configure<AppSettings>(Configuration.GetSection("appsettings")); 

あなたが値を手動で設定するか、AppSettingsクラスを初期化する必要はありませんこの方法です。

そして、あなたのサービスでそれを使用します。

public class Call : ICall 
{ 
    private readonly AppSettings appSettings; 

    public Call(IOptions<AppSettings> appSettings) 
    { 
     this.appSettings = appSetings.Value; 
    } 

    public Task<HttpResponseMessage>GetHttpResponseMessageFromDeviceAndDataService() 
    { 
     var client = new HttpClient(); 
     var uri = new Uri(appSettings.Uri); 
     var response = GetAsyncHttpResponseMessage(client, uri); 
     return response; 
    } 
} 

をIoCのコンテナは、コンソールアプリケーションでも使用することができ、あなたはそれを自分でブートストラップするようになりました。 ServiceCollectionクラスは依存関係がなく、正常にインスタンス化することができます。設定が完了したら、IServiceProviderに変換してメインクラスを解決すれば、他のすべての依存関係が解決されます。

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var configurationBuilder = new ConfigurationBuilder() 
      .AddJsonFile("appsettings.json"); 
     var configuration = configurationBuilder.Build() 
      .ReloadOnChanged("appsettings.json"); 

     var services = new ServiceCollection(); 
     services.Configure<AppSettings>(configuration.GetSection("appsettings")); 
     services.AddTransient<ICall, Call>(); 
     // add other services 

     // after configuring, build the IoC container 
     IServiceProvider provider = services.BuildServiceProvider(); 

     Program program = provider.GetService<Program>(); 

     // run the application, in a console application we got to wait synchronously 
     program.Wait(); 
    } 

    private readonly ICall callService; 
    // your programs main entry point 
    public Program(ICall callService) 
    { 
     this.callService = callService; 
    } 

    public async Task Run() 
    { 
     HttpResponseMessage result = await call.GetHttpResponseMessageFromDeviceAndDataService(); 

     // do something with the result 
    } 
} 
+0

'Configure'メソッドがあることを意味しましたか?例: 'public void Configure(IApplicationBuilder app) { //アプリケーションパイプラインをここで設定します }'。だから、どのクラスがそれを持っていますか?メソッドは 'AppSettings.cs'にありますか? –

+0

'Configure'はASP.NET IoCコンテナのベースとなる' IServiceCollection'のメソッドで、登録に使用され、 'Startup'クラスの' ConfigureServices'メソッドの中に追加します – Tseng

+0

'Startup'クラスがあったので、コンソールアプリケーションにコントローラがない。私はそれが私が推測する必要はありません。その周りに道がありますか?コード全体を追加できますか? –

0

次のようIConfigurationRootからのデータにアクセスすることができます。

Configuration["AppSettings:uri"] 

が好きで、私はその情報のために別々のクラスに情報を入れて、DIコンテナにそれを渡すコメントで示唆しました。

クラス

public class AppSettings { 
    public string Uri { get; set; } 
} 

DI

public void ConfigureServices(IServiceCollection services) 
{ 
    services.Configure<AppSettings>(new AppSettings() { Uri = Configuration["AppSettings:uri"] }); 
    // ... 
} 

コントローラ

public class DemoController 
{ 
    public HomeController(IOptions<AppSettings> settings) 
    { 
     //do something with it 
    } 
} 
+0

変数は異なるクラスにあります。私は 'Startup'クラスをインスタンス化すべきですか?もしそうなら、渡す引数があります。わからない...コード全体を追加してください。 –

+0

'startup'クラスの他のインスタンスを作成しないでください。私が示唆しているのは、設定用の新しいオブジェクトを作成し、それをDIを使用してコントローラに挿入することです。そこからクラスに渡すか、DIコンテナから取得することができます。私の例を編集します –

+0

ねえ、私の場合はコントローラがありません。このappseetings.jsonフレームワークを使いたいだけです。 –

3

は、静的クラスを作成

public static class AppSettings 
{ 
    public static IConfiguration Configuration { get; set; } 

    public static T Get<T>(string key) 
    { 
     if (Configuration == null) 
     { 
      var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json"); 
      var configuration = builder.Build(); 
      Configuration = configuration.GetSection("AppSettings"); 
     } 

     return (T)Convert.ChangeType(Configuration[key], typeof(T)); 
    } 
} 

、あなたは

var uri = AppSettings.Get<string>("uri"); 
var rooms = AppSettings.Get<int>("noRooms"); 

appsettings.jsonの例のように

{ 
    "AppSettings": { 
     "uri": "http://localhost:30151", 
     "noRooms": 100 
    } 
} 
+0

私はあなたの答えが大好きです。私はすぐにそれをテストします。私はjsonが2番目のレベルを持っているようなもっと複雑な解決策を好む。(ネスト) –

+4

不正な解決策。静的クラスやシングルトンクラスを使用しないでください。これは、最初はIoC Container/DIを使用する目的に勝ります。 – Tseng

関連する問題