这必须是一个已经解决的问题,我似乎无法找到答案......
我在使用Ninject IoC容器的类库中有一个WPF前端;每个 View 使用 ViewModel 获取 Model 构造函数注入, Model 接收来自{的 Model {1}},也在其构造函数中。
当我输入这些单词时,我发现我可以通过注入一个创建一个派生自DbContext
的类的工厂来解决这个问题,但我只是将问题放在上下文中他们在这里。
此设置使每个窗口拥有工作单元 - 这正是我想要的。问题是,在其中一个窗口中,我想要一个 discard changes 命令,从上下文重新加载所有实体。
我读到唯一可靠的方法是DbContext
上下文并重新实现它。
我可能会有这样的事情:
Dispose
我在想的是这样的事情:
public class SomeModel : ISomeModel
{
private readonly SomeContext _context;
public SomeModel(SomeContext context)
{
_context = context;
}
/* some methods acting upon entities in _context */
}
现在我正在使用Ninject的约定扩展来绑定public class SomeModel : ISomeModel
{
private readonly IContextFactory<SomeContext> _factory;
private SomeContext _context;
public SomeModel(IContextFactory<SomeContext> factory)
{
_factory = factory;
_context = _factory.Create();
}
public void DiscardChanges()
{
_context.Dispose();
_context = _factory.Create();
}
/* some methods acting upon entities in _context */
}
:
DbContext
如果我采用上述方法,我不再需要这种配置了(除此之外,我不能100%确定上下文在我认为时会被处理掉)并且我可以完全控制上下文的时间线和处理。 ..但我觉得我在打破模式中的某些东西 - 并不是说我非常关心打破模式(不是“纯粹主义者”),尽管我很想知道MVVM + DI“纯粹主义者”如何接近这个
另外我知道Ninject有一个 Factory 扩展,它可能不需要工厂类,但是last time I used it, it broke - 类库必须可以被VB6 ActiveX DLL和工厂使用扩展似乎不喜欢那样。