![](/img/trans.png)
[英]Facebook authentication callback on Windows Phone using Caliburn.Micro
[英]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();
}
该方案是:
TextBlock
上显示“ New” ModifyIt
(例如,单击Button
) 感谢任何帮助。
实际答案:
考虑到这一点,它将永远无法工作,原因是您拥有使用容器实例的局部变量。 您没有在第二个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.