MVVM 轻型 SimpleIoc
MVVM Light SimpleIoc
我在我的项目中使用 WPF 和 MVVM Light。我有一些关于 SimpleIoC
containter 和 DI 的小问题。哪个是更好的使用方法,或者告诉我是否不需要在那里使用 DI。
有我的虚拟机构造函数:
public MainViewModel(IDialogService dialogService, IChannelObserverService channelObserverService, IInternalBroadcastService internalBroadcastService,
IUserDataAccessService userDataAccessService, IUserService userService)
和SimpleIoC寄存器:
SimpleIoc.Default.Register<MainViewModel>(() => {
return new MainViewModel(SimpleIoc.Default.GetInstance<IDialogService>(),
SimpleIoc.Default.GetInstance<IChannelObserverService>(),
SimpleIoc.Default.GetInstance<IInternalBroadcastService>(),
SimpleIoc.Default.GetInstance<IUserDataAccessService>(),
SimpleIoc.Default.GetInstance<IUserService>()); });
请告诉我,我需要在那里使用 DI 吗?
首先,我使用了这样的所有服务:
public MainViewModel(){...}
User user = SimpleIoc.Default.GetInstance<IUserService>().GetCurrentLoggedUser();
或者这个:
private IDialogService dialogService;
public MainViewModel()
{
dialogService = = SimpleIoc.Default.GetInstance<IUserService>();
}
private void MyMethod()
{
dialogService.ShowQuestionDialog(abc,abc,abc);
}
所以我在创建视图模型时没有使用 DI。
我建议您使用 DI
,因为它可以开发松散耦合的代码。通过 DI
,您可以减少软件组件之间的紧密耦合。此外,它使单元测试变得方便。
我建议使用这样的构造函数(正如您在 post 中提到的)
public MainViewModel(IDialogService dialogService, IChannelObserverService channelObserverService, IInternalBroadcastService internalBroadcastService,
IUserDataAccessService userDataAccessService, IUserService userService)
但是注册可以简化为
SimpleIoc.Default.Register<IDialogService, DialogService>();
//// Other service registrations.
SimpleIoc.Default.Register<MainViewModel>(); // without injecting the other dependent types.
使用此 DI 将在创建 MainViewModel
.
实例时注入正确的依赖项
因此,使用上述方法,您无需在代码中解析实例,因为它已经注入到构造函数中,因此服务代码可以简化为
private void MyMethod()
{
dialogService.ShowQuestionDialog(abc,abc,abc);
}
我在我的项目中使用 WPF 和 MVVM Light。我有一些关于 SimpleIoC
containter 和 DI 的小问题。哪个是更好的使用方法,或者告诉我是否不需要在那里使用 DI。
有我的虚拟机构造函数:
public MainViewModel(IDialogService dialogService, IChannelObserverService channelObserverService, IInternalBroadcastService internalBroadcastService,
IUserDataAccessService userDataAccessService, IUserService userService)
和SimpleIoC寄存器:
SimpleIoc.Default.Register<MainViewModel>(() => {
return new MainViewModel(SimpleIoc.Default.GetInstance<IDialogService>(),
SimpleIoc.Default.GetInstance<IChannelObserverService>(),
SimpleIoc.Default.GetInstance<IInternalBroadcastService>(),
SimpleIoc.Default.GetInstance<IUserDataAccessService>(),
SimpleIoc.Default.GetInstance<IUserService>()); });
请告诉我,我需要在那里使用 DI 吗? 首先,我使用了这样的所有服务:
public MainViewModel(){...}
User user = SimpleIoc.Default.GetInstance<IUserService>().GetCurrentLoggedUser();
或者这个:
private IDialogService dialogService;
public MainViewModel()
{
dialogService = = SimpleIoc.Default.GetInstance<IUserService>();
}
private void MyMethod()
{
dialogService.ShowQuestionDialog(abc,abc,abc);
}
所以我在创建视图模型时没有使用 DI。
我建议您使用 DI
,因为它可以开发松散耦合的代码。通过 DI
,您可以减少软件组件之间的紧密耦合。此外,它使单元测试变得方便。
我建议使用这样的构造函数(正如您在 post 中提到的)
public MainViewModel(IDialogService dialogService, IChannelObserverService channelObserverService, IInternalBroadcastService internalBroadcastService,
IUserDataAccessService userDataAccessService, IUserService userService)
但是注册可以简化为
SimpleIoc.Default.Register<IDialogService, DialogService>();
//// Other service registrations.
SimpleIoc.Default.Register<MainViewModel>(); // without injecting the other dependent types.
使用此 DI 将在创建 MainViewModel
.
因此,使用上述方法,您无需在代码中解析实例,因为它已经注入到构造函数中,因此服务代码可以简化为
private void MyMethod()
{
dialogService.ShowQuestionDialog(abc,abc,abc);
}