在MVVM Light和SimpleIOC中使用设计时存储库

3

我已经开始使用最新的MVVM Light工具包v4(NuGet预览版v4.1.21,DLL版本:4.0.21.25725),它实现了SimpleIOC模式。

在我的ViewModelLocator.cs中,我有以下内容来处理设计时和运行时的repositories:

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() 调用时)。
IWebRepository:
public interface IWebRepository
{
  string Test(string data);
}

设计Web仓库:

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"
    }
  }
}

这里我错过了什么?


代码看起来不错。这是MVVM Light 4吗?我认为你需要展示你的类和接口定义。 - Phil
你的代码对我来说运行良好。我使用的是MVVM Light v4.0.30319。顺便说一句,我喜欢你的SO小工具。可惜它不能显示回复。 - Phil
嗯...我正在使用最新的预览版(4.1.21),但是NuGet上的DLL GalaSoft.MvvmLight.WPF4.dll显示为v4.0.21.25725。 - Magnus Johansson
谢谢,我本来以为没有人再使用Vista/Win7桌面小工具了。也许我得更新一下它... - Magnus Johansson
糟糕,我刚才报告的是.NET版本。无论如何,我已经更新到4.1.21 - 仍然可以正常工作。尝试创建一个新的测试应用程序并粘贴上面的代码。 - Phil
我在WP4中也遇到了这个问题,版本号是4.1.22.3(程序集可能标记错误,因为它们显示为4.0.22.37318)。 - J F
1个回答

0
        if (ViewModelBase.IsInDesignModeStatic)
        {
            if (!SimpleIoc.Default.IsRegistered<IRepository>())
            {
                SimpleIoc.Default.Register<IRepository, DesignWebRepository>();
            }
        }
        else
        {
            SimpleIoc.Default.Register<IRepository, WebRepository>();
        }

请注意检查是否已经注册了存储库,以防止重复注册。希望这可以解决您的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接