![](/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.