我在我当前的项目中使用WPF,MVVM和Entity Framework。
为了简单起见,假设我有一个用于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上下文的最佳方法是什么?
在名为 ForTestingPurposes 的viewmodel中创建一个新的bool属性,当SaveChanges方法失败时:
try
{
Context.SaveChanges();
}
catch
{
if (!ForTestingPurposes)
{
Context = new WTContext(SettingsManager.Instance.GetConnectionString());
}
}
向mainviewmodel发送消息以进行上下文重新加载(通过中介模式):
Mediator.Instance.NotifyColleagues<SolidWoods_VM>(MediatorMessages.NeedToUpdateMyContext, this);
(但是,这样我仍然需要bool属性)
3.为您提供更优雅的解决方案,没有附加属性:)
答案 0 :(得分: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(/*...*/);
}
}
}
通过这种方式,您仍然可以实现伪/模拟数据源,但您的视图模型类不需要知道有关如何实际检索数据的任何信息。
答案 1 :(得分:0)
我的观点是,你最好的选择就是留言。
您需要一种方法来指示保存出错,并且可能无法为该类的所有使用者提供重新生成的上下文。例如,如果您在那里绑定了VM,重置上下文可能会产生其他UI后果。