簡體   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