我有以下
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 实现为自动工厂并注入......
但是我意识到我错过了一件重要的事情:
当我需要那些在TextFileProjectViewModel
和SpreadsheetProjectViewModel
中创建的服务时MainWindowViewModel
,我需要手动将引用注入其中。
我在某处读到,从设计的角度来看,将容器引入容器MainWindowViewModel
是一件坏事,因为它会产生不必要的依赖。但是我不知道如何使用 DI 容器(任何,而不仅仅是 Unity)来解析内部的其他视图模型,MainWindowViewModel
而无需在MainWindowViewModel
.
我错过了什么还是我犯了设计/架构错误?