私はまったく別のアプローチを取るでしょう。何も関与しないアプローチstatic
です。
まず、目的の構成設定を厳密に型指定するクラスを作成します。
public class MyConfig
{
int DecimalPlaces { get; set; }
string AdministratorEmail { get; set; }
//...
}
次に、いくつかのリポジトリを作成して永続化レイヤーを抽象化します。
public interface IMyConfigRepository
{
MyConfig Load();
void Save(MyConfig settings);
}
これらの設定を読み書きできるクラスは、このリポジトリの実装に依存していることを静的に宣言できます。
public class SomeClass
{
private readonly IMyConfigRepository _repo;
public MyClass(IMyConfigRepository repo)
{
_repo = repo;
}
public void DoSomethingThatNeedsTheConfigSettings()
{
var settings = _repo.Load();
//...
}
}
ここで、必要に応じてリポジトリ インターフェイスを実装し (今日はデータベース内の設定が必要で、明日は .xml ファイルにシリアル化し、来年はクラウド サービスを使用する可能性があります)、必要に応じて構成インターフェイスを実装します。
これで設定は完了です。必要なのは、インターフェイスをその実装にバインドする方法だけです。Ninject の例を次に示します (NinjectModule
派生クラスのLoad
メソッド オーバーライドで記述):
Bind<IMyConfigRepository>().To<MyConfigSqlRepository>();
MyConfigCloudRepository
次に、実装が必要になったときに、または実装を交換するだけMyConfigXmlRepository
です。
asp.net アプリケーションであるため、Global.asax
(アプリの起動時に) ファイル内でこれらの依存関係を結び付けてください。そうすれば、IMyConfigRepository
コンストラクター パラメーターを持つすべてのクラスに が挿入され、読み込めるオブジェクトMyConfigSqlRepository
が提供されます。MyConfigImplementation
好きなように保存してください。
IoC コンテナーを使用していない場合は、アプリnew
の起動MyConfigSqlRepository
時に を起動し、必要な型のコンストラクターにインスタンスを手動で挿入します。
このアプローチの唯一の点は、DependencyInjection に適したアプリ構造をまだ持っていない場合、大規模なリファクタリングを意味する可能性があることです。つまり、オブジェクトを分離new
して依存関係を排除し、単体テストをより簡単に対象に集中させることができます。単一の側面であり、依存関係のモックアップがはるかに簡単です...他の利点の中でも.