3

我已经开始使用最新的 MVVM Light 工具包 v4 (NuGet preview 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() 调用中)

IWeb存储库:

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

设计网络存储库:

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

主视图模型:

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

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

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

于 2013-03-22T12:30:05.130 回答