我目前正在使用MVVM Light作为MVVM框架,实体框架作为ORM和MS同步框架作为同步手段的WPF MVVM应用程序本地Sql Compact DB与在线SQL数据库。该应用程序的范围也相当复杂,因为它旨在管理资产,计算在整个生命周期内使用该资产时的损耗。幸运的是,我对所有这些技术都陌生,所以无知是幸福:)我找到了很多有关创建工作单元模式和存储库模式的教程和信息。但是,我正在使用新读的DbContext,我已经阅读过这两种模式。生成ADO.Net DbContext到视图模型的最佳方法
我目前的问题涉及在实体框架中使用新的DbContext。我在VS中使用了DbContext Generator模板,所以我有一个MyDbModelContainer。我直接从我的视图模型中使用了这个,这为每个虚拟机创建了一个Context,我敢肯定这是一个坏主意。这里是我的父/子类型数据输入场景的构造函数,我在这里构造容器,并且他们使用MVVM Light将选定项传递给子虚拟机。
Private FatigueDbContext As FatigueModelContainer
Public Sub New()
If IsInDesignMode = False Then
FatigueDbContext = New FatigueModelContainer
FatigueDbContext.CtMaterials.Load()
CtMaterialsCollection = FatigueDbContext.CtMaterials.Local
FatigueDbContext.CtManufactures.Load()
CtManufactures = FatigueDbContext.CtManufactures.Local
End If
End Sub
我想保持上下文打开我的视图模型的寿命,这样我可以使用MyDbModelContainer.MyTable.Local进行绑定。所以,虽然这是工作,我应该如何正确处理这个?
我的直觉是我需要以某种方式将自动生成的MyDbModelContainer包装到一些基本上只包含我需要在该视图模型中使用的表和函数的类中。
我不使用视图模型定位,而是另一种视图模型来管理我的看法,计上心来,从Rachel's blog,我喜欢这个概念。但是,这意味着我要先创建所有View-Models,并预先初始化任何视图模型依赖项。我只有一个窗口,只是在它们留在内存中的视图模型之间切换,而当切换到新的视图模型时,我没有办法关闭我的DbContext。
这里是壳牌视图模型
Public Class ShellViewModel
Inherits ViewModelBase
#Region "Fields"
Private _changePageCommand As ICommand
Private _currentPageViewModel As IPageViewModel
Private _pageViewModels As List(Of IPageViewModel)
#End Region
Public Sub New()
Dim DialogService As New ModalDialogService
' Add available pages
PageViewModels.Add(New ImportJobDataViewModel(DialogService))
PageViewModels.Add(New TestViewModel())
PageViewModels.Add(New ReverseBendUtilityViewModel(DialogService))
' Set starting page
CurrentPageViewModel = PageViewModels(0)
End Sub
#Region "Properties/Commands"
Public ReadOnly Property ChangePageCommand() As ICommand
Get
If _changePageCommand Is Nothing Then
_changePageCommand = New RelayCommand(Of IPageViewModel)(Sub(param) ChangeViewModel(param))
End If
Return _changePageCommand
End Get
End Property
Private Function IsViewPageModel(viewPageModel As IPageViewModel) As Boolean
If TypeOf (viewPageModel) Is IPageViewModel Then
Return True
Else
Return False
End If
End Function
Public ReadOnly Property PageViewModels() As List(Of IPageViewModel)
Get
If _pageViewModels Is Nothing Then
_pageViewModels = New List(Of IPageViewModel)()
End If
Return _pageViewModels
End Get
End Property
Public Property CurrentPageViewModel() As IPageViewModel
Get
Return _currentPageViewModel
End Get
Set(value As IPageViewModel)
If _currentPageViewModel IsNot value Then
_currentPageViewModel = value
RaisePropertyChanged(Function() CurrentPageViewModel)
End If
End Set
End Property
#End Region
#Region "Methods"
Private Sub ChangeViewModel(viewModel As IPageViewModel)
If Not PageViewModels.Contains(viewModel) Then
PageViewModels.Add(viewModel)
End If
CurrentPageViewModel = PageViewModels.FirstOrDefault(Function(vm) vm Is viewModel)
End Sub
#End Region
End Class
因此,代码以总括起来......我应该从自动生成FatigueModelContainer一边创造了一些单独的类,会是什么阶级的样子比如说,它会只是一个班级,还是根据业务运营的不同分类?例如添加,更新和删除制作的类,添加,更新和删除材质的类等。我应该在哪里插入虚拟机?推测在壳牌视图模型?
我通常在'IPageViewModel'上为任何初始化逻辑提供一个通用的'SetActive()'方法,并且每当CurrentPageViewModel发生变化时调用'CurrentPageViewModel.SetActive()' – Rachel 2012-10-31 13:33:47