web-dev-qa-db-ja.com

クラスライブラリからAsp.net-coreのappsetting.jsonへのアクセス

クラスライブラリからappsetting.jsonファイルにアクセスしようとしています。これまでのところ、私が見つけた解決策は、Microsoft.Extensions.ConfigurationからIConfigurationインターフェースを実装する構成クラスを作成し、jsonファイルをクラスに追加して、そこから読み取ることです。

var configuration = new Configuration();
configuration.AddJsonFile("appsetting.json");
var connectionString= configuration.Get("connectionString");

Appsetting設定にアクセスするたびにjsonファイルを追加する必要があるため、これは悪いオプションのようです。 ASP.NETConfigurationManagerのような代替手段はありません。

27
Parameswar Rao

クラスライブラリにはデフォルトで_appsettings.json_がないため、Webアプリケーションから_appsettings.json_ファイルにアクセスすることを想定しています。

_appsettings.json_のセクションの設定に一致するプロパティを持つモデルクラスを作成します。

appsettings.jsonのセクション

_"ApplicationSettings": {
    "SmtpHost": "mydomain.smtp.com",
    "EmailRecipients": "[email protected];[email protected]"
}   
_

一致するモデルクラス

_namespace MyApp.Models
{
    public class AppSettingsModel
    {
        public string SmtpHost { get; set; }
        public string EmailRecipients { get; set; }
    }
}
_

次に、そのモデルクラスを作成し、DIコンテナのIOptionsコレクションに追加します(これは、スタートアップクラスのConfigure()メソッドで実行されます)。

_services.Configure<AppSettingsModel>(Configuration.GetSection("ApplicationSettings"));

// Other configuration stuff

services.AddOptions();
_

その後、コンストラクターのパラメーターとして追加することにより、フレームワークが呼び出す任意のメソッドからそのクラスにアクセスできます。フレームワークは、クラスの検索とコンストラクターへの提供を処理します。

_public class MyController: Controller
{
    private IOptions<AppSettingsModel> settings;

    public MyController(IOptions<AppSettingsModel> settings)
    {
        this.settings = settings;
    }
}
_

次に、クラスライブラリのメソッドに設定が必要な場合、設定を個別に渡すか、オブジェクト全体を渡します。

27
Clint B

回答が既に受け入れられていることは知っていますが、この質問はGoogleのトップヒットであり、OPの質問はクラスライブラリに関するものであり、ASP.NET Web AppやWebApiではなく、受け入れられた回答が使用するものです。

IMO、クラスライブラリはアプリケーション設定を使用してはならず、そのような設定に依存しない必要があります。クラスライブラリでアプリケーション設定が必要な場合は、コンシューマからこれらの設定を提供する必要があります。この例を見ることができます On This SO Question

36
Stephen Porter

私は質問に受け入れられた答えがあることを知っていますが、質問はクラスライブラリに関するものであり、クラスライブラリからappsettings.jsonを読み取る方法は次のとおりです:

設定ファイルのプロパティと一致するプロパティを持つモデルを作成します。

public class ConfigurationManager
{
    public string BaseUrl { get; set; }
}

Appsettings.jsonに実際の設定を追加します

  "ConfigurationManager": {
    "BaseUrl": "myValue"
  }

次に、startup.csのモデルでappsettings.jsonセクションを登録します。

 services.Configure<ConfigurationManager>(Configuration.GetSection("ConfigurationManager"));

クラスライブラリで、使用しているクラスを作成します

using Microsoft.Extensions.Options;

構成設定を取得します。

using Microsoft.Extensions.Options;


public class KeyUrls: IKeyUrls
{
    public string BaseUrl = "";
    private readonly IOptions<ConfigurationManager> _configurationService;

    public KeyUrls(IOptions<ConfigurationManager> configurationservice)
    {
        _configurationService = configurationservice;
        BaseUrl = _configurationService.Value.BaseUrl;
    }

    public  string GetAllKeyTypes()
    {
        return $"{BaseUrl}/something";
    }

    public  string GetFilteredKeys()
    {
        return $"{BaseUrl}/something2";
    }
}

詳細については This を確認してください

6
ThunD3eR

質問には受け入れられた答えがありますが、スタートアッププロジェクトやAsp.NetCoreスタックまたはIServiceCollectionとの依存関係を持たないクラスライブラリだけに当てはまるものはないと思います。

これは、クラスライブラリから構成を読み取る方法です。

using Microsoft.Extensions.Configuration;
using System.IO;

public class ConfigSample
{
    public ConfigSample
    {
            IConfigurationBuilder builder = new ConfigurationBuilder();
            builder.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json"));

            var root = builder.Build();
            var sampleConnectionString = root.GetConnectionString("your-connection-string");
    }
}

次のヌゲットパッケージが必要です。

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.FileProviders.Abstractions
  • Newtonsoft.Json
  • Microsoft.Extensions.Configuration.Json
5

追加参照 of System.Configurationクラスを追加したプロジェクトで、すべてのキーを使用できます。それは私のために働いた。

0
sami ullah