3

SimpleIOC パターンを実装する最新の MVVM Light ツールキット v4 (NuGet プレビュー v4.1.21、DLL v: 4.0.21.25725) の使用を開始しました。

私の ViewModelLocator.cs には、デザイン リポジトリとランタイム リポジトリの両方を処理するための次のものがあります。

public ViewModelLocator()
{
  ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
  if (ViewModelBase.IsInDesignModeStatic)
  {
    SimpleIoc.Default.Register<IWebRepository, DesignWebRepository>();
  }
  else
  {
    SimpleIoc.Default.Register<IWebRepository, WebRepository>();
  }

  SimpleIoc.Default.Register<MainViewModel>();
}

public MainViewModel Main
{
  get
  {
    return ServiceLocator.Current.GetInstance<MainViewModel>();
  }
}

しかし、これにより、ビューに対してデザイナーで次の例外が発生します(コンパイルエラーもランタイムエラーもありませんが、ブレンド機能が失われます):
Class Repository.IWebRepository is already registered
(最初の .Register() 呼び出しで)

IWeb リポジトリ:

public interface IWebRepository
{
  string Test(string data);
}

設計 Web リポジトリ:

public class DesignWebRepository : IWebRepository
{
  public string Test(string data)
  {
    return "design result: " + data;
  }
}

ウェブリポジトリ:

public class WebRepository : IWebRepository
{
  public string Test(string data)
  {
    return "result: " + data;
  }
}

MainViewModel:

public class MainViewModel : ViewModelBase
{
  IWebRepository webRepository;

  public MainViewModel(IWebRepository webRepository)
  {
    this.webRepository = webRepository;
    if (IsInDesignMode)
    {
      // Code runs in Blend --> create design time data.
    }
    else
    {
      // Code runs "for real"
    }
  }
}

ここで何が欠けていますか?

4

1 に答える 1