0

私はいくつかのグローバル/セミグローバル コレクションを持っています。

追加するタイマーのスケジュールの 1 つ

もう 1 つは、多数のアクションを実行できるリモート コンピューターを表すコレクションです。

現在、直接参照するインスタンス化されたコレクションが 1 つあります。

代わりにメッセージングを使用することを考えていましたが、Messenger.Default.Register を実行することは、グローバルを使用することとそれほど変わらないようで、テスト可能ではないようです (ただし、リストの各要素に関数を追加または実行することは、テストしたいものではないかもしれません)。

特定のビューモデルに登録し、代わりにメッセンジャーをビューモデル コンストラクターに渡す必要がありますか? それともまったく別のことをしますか?

4

1 に答える 1

1

MVVM Lightを使用していると思います...

そう:

基本的に 2 つのグローバル コレクションがある場合、シングルトンが 2 つあります。問題は、それらをビューモデルに最適に統合する方法です。

これらの両方をサービスとして扱い、それらを保持するクラスをインターフェイスにラップします。そう:

public interface IRemoteComputersService
{
    void AddComputer(Computer computerToAdd);
    void RemoveComputer(Computer computerToremove);
    ReadOnlyCollection<Computer> RemoteComputers{get;}
}

インターフェイスは、リモート PC を管理するクラスにオーバーロードする必要があります。

私の ViewModelLocator では、それを登録します:

public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        if (ViewModelBase.IsInDesignModeStatic)
        {
            SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
        }
        else
        {
            SimpleIoc.Default.Register<IRemoteComputersService,RemoteComputersService>();
            SimpleIoc.Default.Register<IDataService, DataService>();         
        }
        SimpleIoc.Default.Register<MyViewModel>();
        SimpleIoc.Default.Register<MainViewModel>();
    }

}

私の ViewModel では、それをビューモデルに挿入します。

public class MyViewModel:ViewModelBase, IMyViewModel
{
    public MyViewModel(IRemoteComputersService remoteComputerService)
    {
        _remoteComputerService=remoteComputerService;
    }
}

内部では、SimpleIoc がビューモデルの依存関係を再帰的に解決します。「MyViewModel」は IRemoteComputersService サービスに依存しているため、最初にこれを解決してからビューモデルに挿入します。

MVVM-Light は、コンテナー内で解決された各項目をデフォルトでシングルトンとして扱うため、SimpleIoc によって解決される IRemoteComputersService は 1 つだけであることが保証されます。

これにより、問題が解決されます。PC とタイマーがビューモデルにアクセスしやすくなり、テストしやすくなり、メッセージングを確認する必要がなくなります。

于 2013-07-08T10:24:11.803 に答える