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

时间:2012-05-05 20:54:29

标签: mvvm-light

我已经开始使用最新的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"
    }
  }
}

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

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

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