C# 如果接口位于不同的程序集中,SimpleIoc.Default.Register在IsInDesignModeStatic失败
在C# 如果接口位于不同的程序集中,SimpleIoc.Default.Register在IsInDesignModeStatic失败,c#,mvvm-light,C#,Mvvm Light,在ViewModelLocator的静态构造函数中,将SimpleIoc.Default.Register()类化在ISindesignatic模式下失败。因此,main window.xamldesigner在设计时为空 我已经做了一个简单的解决方案来测试它。我所做的唯一更改是将DataItem类和IDataService接口移动到域项目中 我发现了一个漫游:在ClientWpf项目中添加一个指向IDataService.cs的链接 public class ViewModelLocator
ViewModelLocator
的静态构造函数中,将SimpleIoc.Default.Register()类化如果接口位于不同的项目中,则代码>在ISindesignatic
模式下失败。因此,main window.xaml
designer在设计时为空
我已经做了一个简单的解决方案来测试它。我所做的唯一更改是将DataItem
类和IDataService
接口移动到域项目中
我发现了一个漫游:在ClientWpf项目中添加一个指向IDataService.cs的链接
public class ViewModelLocator {
static ViewModelLocator() {
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic) {
// It fails if the IDataService is in different assembly
// Delete the link of IDataService.cs from the ViewModel folder...
SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
}
else {
SimpleIoc.Default.Register<IDataService, DataService>();
}
SimpleIoc.Default.Register<MainViewModel>();
}
...
}
公共类ViewModelLocator{
静态ViewModelLocator(){
ServiceLocator.SetLocatorProvider(()=>SimpleIoc.Default);
if(ViewModelBase.IsIndesignatic){
//如果IDataService位于不同的程序集中,则会失败
//从ViewModel文件夹中删除IDataService.cs的链接。。。
SimpleIoc.Default.Register();
}
否则{
SimpleIoc.Default.Register();
}
SimpleIoc.Default.Register();
}
...
}
if(ViewModelBase.isindesignatic){
//请将这些行放在这里:
if(SimpleIoc.Default.IsRegistered()){
SimpleIoc.Default.Unregister();
}
SimpleIoc.Default.Register();
}
否则{
SimpleIoc.Default.Register();
}
我觉得在编译项目时,Visual Studio只会重新加载在生成过程中更改的程序集。由于MvvmLight没有更改,它保留了现有实例,包括所有注册的接口。。。在我的例子中,我将ViewModelLocator移动到一个共享类库中,以便在Wpf和Android之间使用。我完全删除了注册IDataService的行,但仍然存在完全相同的问题。如果删除ViewModelBase.isIndesignModeratic
行,则设计器工作正常,没有问题。
if (ViewModelBase.IsInDesignModeStatic) {
// put these lines here:
if (SimpleIoc.Default.IsRegistered<IDataService>()) {
SimpleIoc.Default.Unregister<IDataService>();
}
SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
}
else {
SimpleIoc.Default.Register<IDataService, DataService>();
}