我知道这个问题已经被提出并进行了很多讨论(例如Here和Here以及此Article)。尽管如此,我仍然对此感到困惑。我知道DbContext
s不应该在应用程序生命周期内存活,我知道它们应该按照Form(窗口)或每个Presenter使用。问题是我没有表格或演示者。我有一个包含许多视图模型的Form(Window),其中一些在应用程序的持续时间内存在,几乎所有的视图模型都依赖于DbContext
(LOB应用程序,WPF,MVVM,Sql Server CE) 。
我的解决方案是将DbContext
隐藏在工厂后面,该工厂注入所有需要访问DbContext
的视图模型,并且这些视图模型在加载相应视图时创建/处置DbContext
/卸载。
我想知道这个解决方案是否存在任何问题,或者是否有更好的解决方案可以提供建议?
答案 0 :(得分:0)
我倾向于按照以下方式展示我的项目;
1)表示层:
Contains my Views and ViewModels
2)业务层:
Contains my business logic
3)数据层:
Contains my models
我的Presentation层调用业务层来填充我希望在ViewModel / View中使用的数据的本地副本(在ViewModel中保存)。
这是通过Using语句实现的,例如;
Using DBContext As Entities = ConnectToDatabase()
Dim clsApprovalTypes As New Repositories.clsApprovalTypesRepository(DBContext)
dbResults = clsApprovalTypes.GetRecords()
End Using
Return dbResults
这里我只是将Context传递给Repository,一旦返回数据,“End Using”将处理我的上下文。
要使用我的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
我在这里写了一些关于其中的一些内容;