使用MVVM Light工具包

时间:2017-01-07 04:55:26

标签: wpf mvvm mvvm-light

我目前正在使用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设计模式一致。是否有更好的方法将服务注入视图模型(当前的方法需要花费大量时间来声明初始化属性)

1 个答案:

答案 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接口的任何实现。