次の場合、きれいなコードを書くにはどのような可能性がありますか:
public class App : Application
{
protected override OnStartup(StartupEventArgs e)
{
var arguments = (MyArgumentClass)CommandLineArgumentParser.Parse(e.Args);
// and what now?
}
}
public class ShellViewModel : ViewModelBase
{
// ...
public SubViewModel SubViewModel {get; protected set;}
}
public class SubViewModel : ViewModelBase
{
// is some property which should be set depending on command line arguments
// in the real code it is not just one property in one view model
// but several properties in different view models
public bool MyFlag { get; set;}
}
私の質問は次のとおりです。
- コマンド ライン引数をどこ (どのクラス) に保存し、それらを必要とするビュー モデルに適用しますか?
- アプリケーション設定についても同じ質問です。
私のアイデア:
App に設定を静的プロパティとして保存するため、必要なときに App.CommandLineArgumets.Flag ごとにビュー モデルから簡単に値にアクセスできます。問題: これにより、ビュー モデルが実際のアプリケーションに関連付けられます。この質問が発生した場合、これがまさに問題です (Properties.Settings.Default と同じ問題)。
CommandLineArguments オブジェクトをビューに渡し、ビューからビュー モデルの値を設定します。この場合に見られる問題: 同じビュー モデル クラスを使用する 2 つのアプリケーションがあります (おそらくもっと早くなるでしょう)。ビュー モデル クラスまたはサブクラスを変更する必要がある場合は、それを使用するすべてのアプリケーションのコードを更新する必要があります。しかし、それはまだちょっときれいですか?
アプリケーション設定の場合、Propertes.Settings.Default のインスタンスを ApplicationSettingsBase としてビュー モデルに渡すこともできますが、ビュー モデルが設定の読み取りと最終的な保存を担当しているとは思えません。
必要な場所で Environment.GetCommandLineArgs() を介してコマンド ライン引数にアクセスします。ただし、これには、コード内のいくつかの場所でコマンド ライン引数を解析する必要があります。
この種の問題に対するより良い/よりクリーンな解決策があるか、何かを見落としている可能性があります。この種の問題の一般的な解決策を探しています。