1

我必须为以下情况编写干净的代码有哪些可能性:

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. 应用程序设置的相同问题。

我的想法:

  • 将 App 中的设置存储为静态属性,因此我可以在需要时从每个 App.CommandLineArgumets.Flag 的视图模型中轻松访问这些值。问题:这会将视图模型与实际应用程序联系起来。在出现此问题的情况下,这正是问题所在(与 Properties.Settings.Default 相同的问题)

  • 将 CommandLineArguments 对象传递给视图并从视图中设置视图模型的值。我在这种情况下看到的问题:我有两个使用相同视图模型类的应用程序(也许会更快)。如果我必须更改视图模型类或任何子类,我需要更新所有使用它的应用程序中的代码。但也许它仍然很干净?

  • 对于应用程序设置,我还可以将 Propertes.Settings.Default 作为 ApplicationSettingsBase 的实例传递给视图模型,但感觉不对,视图模型负责读取并最终存储设置。

  • 在需要的地方通过 Environment.GetCommandLineArgs() 访问命令行参数。但这需要在代码中的多个位置解析命令行参数。

对于此类问题,也许有更好/更清洁的解决方案,或者我忽略了一些东西。我正在寻找此类问题的通用解决方案。

4

1 回答 1

1

我建议将参数传递给 ViewModel 的构造函数。您将需要在某些时候实例化 ViewModel,如果您将命令行参数存储为应用程序中的静态变量(根据您的第一个场景),工厂代码可能可以访问命令行参数。大多数 IoC 容器允许您传递命令行参数,因此如果您使用 IoC,您应该能够获得所需的结果,同时保持 ViewModel 与应用程序分离

于 2013-04-23T11:45:43.773 回答