【问题标题】:Accessing Mock services in designmode in Silverlight 4在 Silverlight 4 中以设计模式访问 Mock 服务
【发布时间】:2011-03-09 14:09:35
【问题描述】:

我的请求是similar to this

我正在使用 MvvmLight,Viewmodel 信息在设计时和运行时正确显示。但是我想把它抽象成一个服务类。所以我有我的模拟服务和实现 IService 的真实服务。

在 app.xaml 的代码隐藏中,我正在检查设计时间,然后根据检查返回的内容调用我的服务加载器上的方法。

if (IsInDesignModeStatic)
            {
                ServiceLoader.LoadDesignTimeServices();
            }
            else
            {
                ServiceLoader.LoadRunTimeServices();

            }


public sealed class ServiceLoader
    {
        private ServiceLoader()
        {
        }

        public static void LoadDesignTimeServices()
        {
            ServiceContainer.Instance.AddService<IQuestionsService>(new dt.QuestionsService());
        }

        public static void LoadRunTimeServices()
        {

            ServiceContainer.Instance.AddService<IQuestionsService>(new rt.QuestionsService());

        }
    }

这在运行时工作得很好,但在设计时不行。如果我真的在我的视图模型中使用设计时具体实现:

if (IsInDesignMode)
            {

                //var s = Infrastructure.GetService<IQuestionsService>();
                var s = new ReadmissionTrackingApplication.Client.Services.DesignTime.QuestionsService();

                QuestionCollectionView_Refresh(s.getQuestions());
            }
            else
            {
                //Listens for New Questionairre request. It receives the current ReadmitPatientResult
                Messenger.Default.Register<fnReadmitPatientList_Result>(this, ReceiveNewQuestionairreRequest);

                //TODO for testing only
                ReceiveNewQuestionairreRequest(null);

            }

它出现在 Blend 中。我需要做什么才能允许访问混合中的模拟服务?我想我记得读过我必须以某种方式将服务加载器添加到我的应用程序资源中,类似于使用视图模型完成的操作......但我不知道它需要如何完成,我认为它与 vm 的完成方式不同,因为我不是在视图中访问服务,而是从视图模型中访问。

【问题讨论】:

    标签: silverlight-4.0 expression-blend mvvm-light


    【解决方案1】:

    问题是 Blend 没有执行所有代码。要检查这一点,您可以附加一个调试器(从 Visual Studio 10 到 Blend 4,确保选择托管代码 V4.0)并在设置代码中放置一个断点。可能它没有被调用。

    要解决这个问题,您可以尝试在 ViewModelLocator 中进行设置。由于 VML 是在 App.xaml 资源中创建的,因此 Blend 正在运行该代码。例如,您可以将设置代码放在静态 VML 构造函数中。

    干杯, 洛朗

    【讨论】:

    • 我可以通过改变 servicecontainer 的工作方式来让它工作。以前,当它只在不需要检查它是否已经运行时才被调用时,如果collectioncount>0,我现在让它在LoadDesigntime服务上自行清除......然后我将serviceloader.LoadDesigntimeservices添加到ctor的设计时调用中的实际视图模型..我也停止调用 dispatcherhelper.initialize。它现在似乎是这样工作的。
    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    相关资源
    最近更新 更多