2012-06-01 36 views
0

我在當前項目中使用WPF,MVVM和實體框架。刷新ViewModel的實體框架上下文

爲了簡單起見,我們假設我有一個針對CRUD操作的視圖模型,用於列出材質(實體木材)。

我的視圖模型的EF上下文(WTContext)通過屬性注入初始化,例如:

SolidWoods_VM newView = new SolidWoods_VM(); 
newView.Context = new WTContext(SettingsManager.Instance.GetConnectionString()); 

這樣我能夠測試這個視圖模型:

SolidWoods_VM swVM = new SolidWoods_VM(); 
swVM.Context = new FakeWTContext(); 

試想一下,在插入操作出錯,WTContext.SaveChanges()失敗。 刷新ViewModels上下文的最佳方式是什麼?

  1. 在名爲ForTestingPurposes的視圖模型創建一個新的布爾屬性,並且當SaveChanges方法失敗:

    try 
    { 
        Context.SaveChanges(); 
    } 
    catch 
    { 
        if (!ForTestingPurposes) 
        { 
         Context = new WTContext(SettingsManager.Instance.GetConnectionString()); 
        } 
    } 
    
  2. 發送一個消息給mainviewmodel上下文(通過介體圖案)重裝:

    Mediator.Instance.NotifyColleagues<SolidWoods_VM>(MediatorMessages.NeedToUpdateMyContext, this); 
    

(然而,這樣我仍然需要布爾屬性)

3.A更優雅的解決方案,沒有aditional的特性,提供你們:)

回答

1

爲什麼不把你的數據上下文需要的方法/屬性抽象到接口上,然後有一個處理異常的實現。

//WARNING: written in SO window 
public interface IDataSource 
{ 
    void SaveChanges(); 
    //... and anything else you need ... 
} 

public class RealDataSource : IDataSource 
{ 
    private WTContext _context; 

    public void SaveChanges() 
    { 
     try { _context.SaveChanges(); } 
     catch 
     { 
      _context = new WTContext(/*...*/); 
     } 
    } 
} 

這樣你仍然可以實現一個假/模擬的數據源,但您的視圖模型類並不需要了解數據是如何實際檢索任何東西。

0

我的觀點是你最好的選擇將是信息。

您需要一種方式來指示保存出錯,並且可能無法爲該類的所有用戶重新生成上下文。例如,如果您在那裏綁定了您的虛擬機,則重置上下文可能會導致其他UI的後果。

+0

雖然我正在閱讀你的答案,我意識到,即使有消息選項,我需要有bool屬性......我正在尋找一個選項,我不需要聲明特定於測試的屬性。 –