これは完全なアーキテクチャ変更がなければ不可能かもしれないが、実行時にユーザーに設定可能なオプションを公開するクラス(プラグイン)があると思う。クラスのインスタンス化後に実行時に依存性注入を使用する
プログラムが起動し、ユーザーはさまざまなプラグインの使用を選択できます。ユーザーはプラグインごとに変更できるオプションがあります。ユーザーは再生ボタンを押します。
ユーザーが使用するプラグインを選択すると、そのクラスのインスタンスが作成され、そのプラグインで使用可能なオプションが表示されます。明らかに通常の状況では、クラスがインスタンス化されたコンストラクタ引数が渡されます。このシナリオでは、プラグインにILoggerのコンストラクタ引数があり、具体クラスにDirectoryPathのコンストラクタ引数がありますが、私のIOCコンテナにそれを渡す?
public class MyPlugin
{
private ILogger Logger;
private Dictionary<string, object> Properties = new Dictionary<string, object>();
public MyPlugin(ILogger Logger)
{
this.Logger = Logger;
SetupProperties();
}
private SetupProperties()
{
Properties.Add("LogDirectory","Please enter a directory");
}
private void UserPressedPlay()
{
//We can now read the property values user has entered
//Now I want to instantiate FileLogger with the LogDirectory property
}
public DoSomething(string Data)
{
this.Logger.Write(Data);
}
}
public interface ILogger
{
void Write(string Data);
}
public FileLogger : ILogger
{
private string DirectoryPath;
public FileLogger(string Directory)
{
this.DirectoryPath = Directory;
}
public Write(string Data)
{
//Write to file
}
}
私は現在IOCコンテナを使用していないので、これを回答として投稿しませんが、実際のILoggerではなくILoggerファクトリを渡すことをお勧めします。ファクトリは、ユーザの引数でUsrePressedPlayから呼び出され、実際のLoggerインスタンスを作成できます。 –
現在のアーキテクチャを変更することなく、IoCのデフォルトのコンストラクタ設定をAppData \ Local \ Tempフォルダに設定し、ユーザーがクリックした後にLoggerインターフェイスを再初期化します。 これはややこしいことですが、ロガーの工場の言及を500回伝えるのは間違いですが、Internal Server Errorは素晴らしいアイデアです。 –
@ 500-InternalServerErrorこのシナリオでIOCを使用しないと提唱していますか? – Jon