我知道这个问题已经被问过很多次并且讨论过很多次(例如Here和Here以及 this Article)。尽管如此,我仍然对此感到困惑。我知道DbContext
s 不应该在应用程序生命周期内存在,我知道它们应该按表单(窗口)或每个演示者使用。问题是我没有表格或演示者。我有一个带有许多视图模型的表单(窗口),其中一些在应用程序期间存在,几乎我所有的视图模型都依赖于DbContext
(LOB 应用程序、WPF、MVVM、Sql Server CE)。
我的解决方案是隐藏DbContext
一个工厂,该工厂被注入到所有需要访问的视图模型中,DbContext
并且这些视图模型创建/处置DbContext
当他们相应的视图被加载/卸载时。我想知道这个解决方案是否有任何问题,或者您是否有更好的解决方案可以建议?
问问题
3014 次
1 回答
0
我倾向于将我的项目安排如下;
1)表示层:
Contains my Views and ViewModels
2)业务层:
Contains my business logic
3)数据层:
Contains my models
我的表示层调用业务层来填充我希望在我的 ViewModel/View 中使用的数据的本地副本(保存在 ViewModel 中)。
这是通过 Using 语句实现的,例如;
Using DBContext As Entities = ConnectToDatabase()
Dim clsApprovalTypes As New Repositories.clsApprovalTypesRepository(DBContext)
dbResults = clsApprovalTypes.GetRecords()
End Using
Return dbResults
在这里,我只是将上下文传递到存储库中,一旦返回数据,“结束使用”将处理我的上下文。
为了使用在我的 ViewModel/View 中所做的更改来更新上下文,我使用了一个 AddEdit 例程,它接受一条记录,并根据需要使用与上述类似的方法更新/添加到上下文中,例如;
Using DBContext As CriticalPathEntities = ConnectToDatabase()
Dim clsApprovalTypes As New Repositories.clsApprovalTypesRepository(DBContext)
clsApprovalTypes.AddEditRecord(ApprovalTypeToSave)
Try
clsApprovalTypes.SaveData()
Catch ex As Exception
Return ex
End Try
End Using
我的 AddEdit 例程类似于;
SavedRecord = New ApprovalType 'Store the Saved Record for use later
Dim query = From c In DBContext.ApprovalTypes
Where c.ApprovalType_ID = RecordToSave.ApprovalType_ID
Select c
If query.Count > 0 Then
SavedRecord = query.FirstOrDefault
End If
'
' Use Reflection here to copy all matching Properties between the Source Entity
' and the Entity to be Saved...
'
SavedRecord = Classes.clsHelpers.CopyProperties(RecordToSave, SavedRecord)
If query.Count = 0 Then
Try
DBContext.ApprovalTypes.Add(SavedRecord)
Catch ex As EntityException
Return ex
End Try
End If
我在这里写了更多关于其中的一些内容;
于 2013-05-24T23:36:18.590 回答