我已经开始使用最新的MVVM Light工具包v4(NuGet预览版v4.1.21,DLL v:4.0.21.25725),它实现了SimpleIOC模式。
在我的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>();
}
}
但是这给了我设计器中的以下异常(因此没有编译错误,也没有运行时错误,但我放松了我的Blendability)视图:
Class Repository.IWebRepository is already registered
(在第一个.Register()调用)
IWebRepository:
public interface IWebRepository
{
string Test(string data);
}
DesignWebRepository:
public class DesignWebRepository : IWebRepository
{
public string Test(string data)
{
return "design result: " + data;
}
}
WebRepository:
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"
}
}
}
我在这里缺少什么?
答案 0 :(得分:0)
if (ViewModelBase.IsInDesignModeStatic)
{
if (!SimpleIoc.Default.IsRegistered<IRepository>())
{
SimpleIoc.Default.Register<IRepository, DesignWebRepository>();
}
}
else
{
SimpleIoc.Default.Register<IRepository, WebRepository>();
}
请注意检查存储库是否已注册以防止双重注册。希望这可以解决您的问题