ビューモデル+デザインモードへのSilverlightのコンストラクタ・インジェクション

StackOverflow https://stackoverflow.com/questions/4033600

質問

イムMVVM光を使用して、現在のSilverlight 4イムで検証可能なのviewmodelsを書くことでグリップを取得しよう。

AutoFacとIoCContainerを使用してイムは、その仕事の罰金をやっています。しかし、私はこのコンストラクタチェーンを持つビューにバインドされているのviewmodelsのコンストラクタ、に注入します。

    public UserViewModel() : this(IoCContainer.Resolve<IUserServiceAsync>())
    {

    }

    public UserViewModel(IUserServiceAsync userService) 
    {
        if (this.IsInDesignMode) return;

        _userService = userService;
    }
きれいな感じが、私は、これまで発見した最善の選択肢であるしない

。この作品と私のアプリは、必要に応じて動作し、反転制御とテスト可能です。

しかし、私のVMは次のように私のビューにバインドします:

 <UserControl.DataContext>
            <ViewModel:UserViewModel />
 </UserControl.DataContext>
私のXAMLのページ属性、VS2010とブレンドdoesntの仕事の両方でデザインモードで

イムは、まだデザインモードで動作することをSilverlightでしようものを達成するためのよりよい方法はありますか?契約ブレーカありえないデザインモードを失うが、XAMLを学びながら便利になります。クリーナーなしチェーンの方法がいいかのだろう!

Imは上記のXAMLマークアップ・アプローチに並置として、ビューに解決のviewmodelsにAutoFac /のIoCを使用するかもしれない可能性を考えて、このルートを下る?

感謝します。

役に立ちましたか?

解決

の代わりに最初のコンストラクタを実装するので、私はこのように、あなたがViewModelLocatorを実装勧めます:

public class ViewModelLocator
{

    IoCContainer Container { get; set; }

    public IUserViewModel UserViewModel
    {
        get
        {
            return IoCContainer.Resolve<IUserViewModel>();
        }
    }

}

次に、XAMLであなたは、静的リソースとしてロケータを宣言します:

<local:ViewModelLocator x:Key="ViewModelLocator"/>

あなたのアプリケーションを初期化しますが、それはコンテナのインスタンスにロケータを提供することが必要です。

var viewModelLocator = Application.Current.Resources["ViewModelLocator"] as ViewModelLocator;
if(viewModelLocator == null) { // throw exception here }
viewModelLocator.Container = IoCContainer;

次に、XAMLであなたがきれいにリソースを使用することができます:

<UserControl
    DataContext="{Binding Path=UserViewModel, Source={StaticResource ViewModelLocator}}"
    />
    <!-- The other user control properties -->

設計時のために、あなたはMockViewModelLocatorを実装することができます:

public class MockViewModelLocator
{

    public IUserViewModel UserViewModel
    {
        get
        {
            return new MockUserViewModel();
        }
    }

}

適切にXAMLでそれを宣言します:

<local:MockViewModelLocator x:Key="MockViewModelLocator"/>

そして最後に、あなたのユーザーコントロールでそれを使用します:

<UserControl
    d:DataContext="{Binding Path=UserViewModel, Source={StaticResource MockViewModelLocator}}"
    DataContext="{Binding Path=UserViewModel, Source={StaticResource ViewModelLocator}}"
    />
    <!-- The other user control properties -->

使用するブレンドのためのあなたのモックビューモデルロケータ戻り、安全かつ簡単に読み取り可能なデータを作ることができますし、実行時に、あなたの本当のサービスを使用することになります。

あなたが失うデザイン時データをないし、あなたのビューモデルにおける依存性注入の方法論の清浄度を犠牲にする必要はありません。

この方法

私はこのことができます願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top