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"
}
}
}
ここで何が欠けていますか?