0

我在当前项目中使用 WPF、MVVM 和实体框架。

为简单起见,假设我有一个针对材料列表(实木)进行 CRUD 操作的视图模型。

我的 ViewModel 的 EF 上下文 ( WTContext ) 是通过属性注入初始化的,例如:

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

这样我就可以测试这个 ViewModel:

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

想象一下,在插入操作期间出现问题并且 WTContext.SaveChanges() 失败。刷新 ViewModels 上下文的最佳方式是什么?

  1. 在名为ForTestingPurposes的视图模型中创建一个新的 bool 属性,当 SaveChanges 方法失败时:

    try
    {
        Context.SaveChanges();
    }
    catch
    {
        if (!ForTestingPurposes)
        {
            Context = new WTContext(SettingsManager.Instance.GetConnectionString());
        }
    }
    
  2. 向 mainviewmodel 发送消息以重新加载上下文(通过中介模式):

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

(然而,这样我仍然需要 bool 属性)

3.为你们提供了一个更优雅的解决方案,没有额外的属性:)

4

2 回答 2

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(/*...*/);
        }
    }
}

这样你仍然可以实现一个假的/模拟的数据源,但是你的视图模型类不需要知道数据是如何被实际检索的。

于 2012-06-04T10:42:02.143 回答
0

我的观点是,你最好的选择是信息。

您需要一种方法来指示保存出错,并且它可能无法为类的所有使用者提供重新生成上下文的服务。例如,如果您在其中绑定到您的 VM,则重置上下文可能会产生其他 UI 后果。

于 2012-06-01T14:22:23.740 回答