0

我有什麼可能性寫了下面的情況清晰的代碼:命令行參數和「全局設置」洛杉磯清潔守則

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;} 
} 

我的問題是:

  1. 在哪裏我存儲(哪個類)並將命令行參數應用於需要它們的視圖模型?
  2. 應用程序設置的相同問題。

我的想法:

  • Store中的應用程序中的靜態屬性設置,所以我可以很容易地從每App.CommandLineArgumets.Flag視圖模型在需要時訪問值。問題:這會將視圖模型與實際應用程序聯繫起來。在出現此問題的情況下,這正是問題(與Properties.Settings.Default同樣的問題)

  • 將CommandLineArguments對象傳遞給視圖並從視圖設置視圖模型的值。我在這種情況下看到的問題是:我有兩個使用相同視圖模型類的應用程序(可能會更快)。如果我必須更改視圖模型類或任何子類,我需要更新所有消耗它的應用程序中的代碼。但也許它仍然是乾淨的?

  • 對於應用程序設置,我也可以將作爲ApplicationSettingsBase的Propertes.Settings.Default實例傳遞給視圖模型,但感覺不對,視圖模型負責讀取並最終存儲設置。

  • 訪問經由Environment.GetCommandLineArgs命令行參數()需要它們的地方。但是這需要解析代碼中幾個地方的命令行參數。

也許有這樣一個問題的更好/更乾淨的解決方案,或者我忽視了一些東西。我正在尋找這種問題的一般解決方案。

回答

0

將參數傳遞給ViewModel的構造函數是我的建議。您需要在某個時刻實例化ViewModel,並且如果將它們作爲靜態變量存儲在應用程序中(根據第一種情況),工廠代碼可能有權訪問命令行參數。 大多數IoC容器都允許您傳遞命令行參數,因此如果您使用的是IoC,則應該能夠實現所需的結果,同時保持ViewModel與應用程序的分離