2017-01-07 7 views
0

現在、WPFおよびMVVMライトツールキットを使用してアプリケーションを作成しています。MVVMライトツールキットを使用してViewModelにサービスを注入

私は、このビューモデルを持っている:

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

私の実装は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インターフェイスの実装をインジェクションすることも可能です。

関連する問題