我目前正在使用WPF和MVVM Light工具包制作应用程序。
我有这个视图模型:
public class MainViewModel : ViewModelBase
{
// Instance of service which is used for sending email.
private IEmailService _emailService;
// Get/set instance of service which is used for sending email.
public IEmailService EmailService
{
get
{
return _emailService;
}
set
{
Set("EmailService", ref _emailService, value);
}
}
public MainViewModel()
{
_emailService = new ServiceLocator.Current.GetInstance<IEmailService>();
}
}
电子邮件服务是一种处理发送/处理电子邮件的服务。当用户与屏幕上的元素交互时,将调用电子邮件服务(已在ServiceLocator中注册)
我想知道我的工具是否与MVVM设计模式一致。是否有更好的方法将服务注入视图模型(当前的方法需要花费大量时间来声明初始化属性)
答案 0 :(得分:1)
我想知道我的工具是否与MVVM设计模式一致。
依赖注入实际上与MVVM模式无关。 MVVM是关于用户界面控件与其逻辑之间的关注分离。依赖注入使您能够为类注入所需的任何对象,而无需自己创建这些对象。
是否有更好的方法将服务注入视图模型(当前方法需要花费大量时间来声明初始化属性)
如果在没有引用服务的情况下存在视图模型类没有意义,则应该使用构造函数依赖项注入,而不是通过属性注入依赖项。你可以在这里阅读更多相关信息:
Dependency injection through constructors or property setters?
使用您当前的实现,可以使用不带服务的视图模型类:
MainViewModel vm = new MainViewModel();
vm.EmailService = null;
更好的实现将是这样的:
public class MainViewModel : ViewModelBase
{
// Instance of service which is used for sending email.
private readonly IEmailService _emailService;
public MainViewModel(IEmailService emailService = null)
{
_emailService = emailService ?? ServiceLocator.Current.GetInstance<IEmailService>();
if(_emailService is null)
throw new ArgumentNullException(nameof(emailService));
}
}
这可确保视图模型类始终具有对IEmailService的有效引用。它还可以在构造对象时为其注入IEmailService接口的任何实现。