0

まず、「これはベスト プラクティスではないことはわかっています」と言い、app.config ファイルの情報を web.config ファイルに追加したくないということから始めましょう...はクラス ライブラリそのものであり、多くのクラス ライブラリも使用します。

通常、単体テスト プロジェクト (テストに使用) または Web プロジェクト (本番環境で lib を使用) では、すべての構成情報を追加する必要があります。これらのライブラリはプロジェクトごとに異なる方法で呼び出されることはないため、呼び出し元のプロジェクトに呼び出し先プロジェクトの構成ファイルを読み取らせる方法を探しています。

私はオンラインで調べましたが、これまでに見つけたのは次の2つだけです。

1) しないでください。呼び出し元プロジェクトの構成ファイルに情報を追加する必要があります

例 a)クラス ライブラリ プロジェクトの App.config から読み取る

例 b) app.config ではなく web.config から読み取る ASP.NET のクラス ライブラリ プロジェクト

例 c)ライブラリ プロジェクトの .Net app.config

2)あなたはそれをすべきではありませんが、私はその方法を知っています(含める方法はありません:/)

例 a)クラス ライブラリの app.config

私はしばらくの間「正しい」方法でそれを行ってきました。そのため、多くの web.config とテスト プロジェクトの構成ファイルが残り、class lib app.config ファイルから複製された情報が含まれています。これを行うための特定の正当なユースケースがあると本当に思います。

ありがとう!

4

1 に答える 1

1

私が知っているベスト プラクティスは、ライブラリ内のクラス、または一般的なクラスから app.config/web.config への直接的な依存を避けることです。これは、app.config を使用しないという意味ではありません。これは、クラスがそれを使用していることを知らないことを意味します。

例えば、

public class MyClassThatDependsOnSomeSettings
{
    private readonly ISettings _settings;

    public MyClassThatDependsOnSomeSettings(ISettings settings)
    {
        _settings = settings;
    }

    public void DoSomething()
    {
        var settingA = _settings.SettingA;
    }
}

public interface ISettings
{
    int SettingA {get;}
    string SettingB {get;}
}

これで完了と見なすことができますMyClassThatDependsOnSomeSettings。.config ファイルへのアクセスは必要ありません。を実装するもののインスタンスが必要なだけISettingsです。.config から読み取ることができます

public class SettingsFromConfiguration : ISettings 
{
    public int SettingA 
    {
        get 
        {
            string setting = ConfigurationManager.AppSettings["settingA"];
            int value = 0;
            int.TryParse(setting, out value);
            return value;
        }
    }

    public string SettingB 
    {
        get { return ConfigurationManager.AppSettings["settingB"];}
    }
}

これは物事を動かし、とにかく同じことをしているように見えますか? ほとんどそうです。ISettings大きな違いは、app.config から読み取るの実装を使用できる一方で、他の実装を作成することもできることです。ハードコードされた値を使用するものを作成したり、 を使用する代わりにカスタム構成セクションを作成したりできますAppSettings。または、JSON 構成ファイルを使用するアプリケーションがありAppSettings、クラスがまだ機能しない場合。

これはDependency Inversionを適用します。これは、すべての下で、クラスが具体的な実装ではなく抽象化 (インターフェイスなど) に依存する必要があることを意味します。

コンストラクターに要件を入れることは、依存性注入、具体的にはコンストラクター注入ISettingsと呼ばれます。

于 2016-08-16T14:02:26.490 に答える