2

我有以下

  • ViewModels: MainWindowViewModel , BaseProjectViewModel, TextFileProjectViewModel, SpreadsheetProjectViewModel (TextFileProjectViewModel, SpreadsheetProjectViewModel 继承自 BaseProjectViewModel)

  • 服务:

    FileDIalogService : IFileDialogService
    MessageBoxService : IMessageBoxService
    ModalDialogFactory : IModalDialogFactory
    ModalDialogService : IModalDialogservice

MainWindowViewModel 具有以下构造函数:

public MainWindowViewModel( IModalDialogService     modalDialogService,
                            IModalDialogFactory     modalDialogFactory,
                            IMessageBoxService      messageBoxService,
                            IFileDialogService      fileDialogService)
{
    _modalDialogService = modalDialogService;
    _modalDialogFactory = modalDialogFactory;
    _messageBoxService = messageBoxService;
    _fileDialogService = fileDialogService;
}

在 App.xaml 中我不使用 StartupUri。

目前在 App.xaml.cs 我手动进行引导:

    MainWindow mainWindow = new MainWindow();
    mainWindow.DataContext = new MainWindowViewModel(new ModalDialogService(), new ModalDialogFactory(), new MessageBoxService(), new FileDialogService());
    mainWindow.Show();

我知道我可以使用容器(如 Unity)来执行以下操作:

IUnityContainer container = new UnityContainer();

container.RegisterType<IModalDialogService, ModalDialogService>(new ContainerControlledLifetimeManager());
/* ... and so on for each service interface and its appropriate implementation... */

MainWindow mainWindow = new MainWindow();
mainWindow.DataContext = container.Resolve<MainWindowViewModel>();
mainWindow.Show();

在另一个问题中,我了解到我可以更进一步,将 IModalDialogFactory 实现为自动工厂并注入......

但是我意识到我错过了一件重要的事情:

当我需要那些在TextFileProjectViewModelSpreadsheetProjectViewModel中创建的服务时MainWindowViewModel,我需要手动将引用注入其中。
我在某处读到,从设计的角度来看,将容器引入容器MainWindowViewModel是一件坏事,因为它会产生不必要的依赖。但是我不知道如何使用 DI 容器(任何,而不仅仅是 Unity)来解析内部的其他视图模型,MainWindowViewModel而无需在MainWindowViewModel.

我错过了什么还是我犯了设计/架构错误?

4

1 回答 1

1

对于在 xaml 领域了解不多,我提前道歉,但希望这会有所帮助。

在某些极端情况下,您必须选择正确的 DI 以外的其他东西。最好的情况通常是构造函数注入。

“严格遵守构造函数注入可以很容易地看出何时违反了 SRP 并应该重构为外观服务。” - http://blog.ploeh.dk/2010/02/02/RefactoringtoAggregateServices

对于那些抽象工厂,对 DI 容器或服务定位器的引用是我能想到的最接近解耦的东西。

服务定位器是一种反模式?

也就是说,是什么在构建您的ViewModel,您能否将这种依赖关系推到足够远以使您的DI 组合根可用?

于 2013-07-23T13:58:31.127 回答