繁体   English   中英

如何使用Caliburn.Micro for Windows Phone修改共享对象

[英]How to modify a shared object with Caliburn.Micro for Windows Phone

我有一个在整个应用程序中使用的对象,可以通过某些ViewModel对其进行修改。 我应该如何在AppBootstrapper注册对象?

考虑以下代码:

AppBootstrapper

protected override void Configure()
{
    this.container = new PhoneContainer(RootFrame);
    this.container.RegisterPhoneServices();

    var myObject = this.CreateDefaultObject();
    this.container.Instance(myObject);

    // ... etc.
}

private MyObject CreateDefaultObject()
{
    // blah blah blah

    return new MyObject {
        Status = "New"
    };
}

ViewModel1

public ViewModel1(MyObject myObject, INavigationService navigationService)
{
    this.myObject = myObject;
    this.navigationService = navigationService;
}

public string Status
{
    get { return this.myObject.Status; }
}

ViewModel2

public ViewModel2(MyObject myObject, INavigationService navigationService)
{
    this.myObject = myObject;
    this.navigationService = navigationService;
}

public ModifyIt()
{
    this.myObject = new MyObject {
        Status = "Modified"
    };

    this.navigationService.GoBack();
}

该方案是:

  1. 该应用程序运行并导航到View1,它将在TextBlock上显示“ New”
  2. 用户导航到View2并执行动作ModifyIt (例如,单击Button
  3. 应用程序导航回到View1,这次显示的值应该为“ Modified”

感谢任何帮助。

实际答案:

考虑到这一点,它将永远无法工作,原因是您拥有使用容器实例的局部变量。 您没有在第二个ViewModel中保留该实例,实际上是在覆盖本地实例,以便不再引用该容器实例。 因此,我的最后建议是,如果要使代码与原始实现相似,请按照上述说明进行操作并换出属性值。

您处于正确的路径上,实例每次请求时,实例都会向您返回相同的“实例”,因为您将此实例设置为新实例,它将在每次请求时覆盖您的设置。

而是注册为单身人士。

 
 
 
  
  container.Singleton<MyObject>();
 
  

这将允许您修改实例。 如果需要预先创建对象,另一种选择是将对象的构造移到 container.Instance调用之外。

 
 
 
  
   var myObject = new MyObject("new"); container.Instance(myObject);
 
  

那对你有用

两者之间的区别在于,单例直到第一个请求才被实例化,实例通常在服务声明时被实例化。 我们目前正在最终确定SimpleContainer的文档,并将在下周开始提供。

编辑:

因此,从下面的测试中可以看出,这是行不通的。 最后一个断言将失败。 我将需要与团队讨论此问题,因为我不知道这是否是设计使然。

 
 
 
  
   [Fact] public void GetInstance_returns_the_latest_updated_instance() { var instanceA = new object(); var instanceB = new object(); var container = new SimpleContainer(); container.RegisterInstance(typeof(object), "A", instanceA); Assert.False(instanceA == instanceB); var returnedInstance = container.GetInstance(typeof (object), "A"); Assert.True(instanceA == returnedInstance); returnedInstance = instanceB; var finalInstance = container.GetInstance(typeof (object), "A"); Assert.True(returnedInstance == finalInstance); }
 
  

在这一点上,我的建议是将您的任务下推。 我的意思是您的 MyObject成为另一个对象的属性。 这样一来,您就可以自由地交换财产。 由于实例永不更改,因此它应按预期工作。 这就是我要这样做的原因,这就是我做出原始假设的原因。 我倾向于使用几个应用程序级别的服务,这些服务可以包装其他服务,因此我的构造函数不会变得很长。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM