2013-05-24 2 views
0

Я знаю, что этот вопрос задан и обсужден много (например, Here и Here и этот Article). Тем не менее, я все еще чувствую смущение. Я знаю, что DbContext s не должен проживать в течение всего срока службы приложения, я знаю, что они должны использоваться для каждой формы (окна) или для презентатора. Проблема в том, что у меня нет форм или презентаторов. У меня есть одна форма (окно) со многими моделями просмотров, некоторые из которых живут в течение всего приложения, и почти все мои модели просмотров зависят от DbContext (приложение LOB, WPF, MVVM, Sql Server CE).
Мое решение состоит в том, чтобы скрыть DbContext за фабрикой, которая вводится во все модели просмотра, которым необходим доступ к DbContext, и эти модели просмотра создают/удаляют DbContext, когда их соответствующее представление загружается/выгружается. Я хотел бы знать, есть ли у этого решения какие-либо проблемы или есть лучшее решение, которое вы могли бы посоветовать?Управление временем жизни DbContext в толстом WPF-клиенте

ответ

0

Я, как правило, выкладываю свои проекты следующим образом;

1) Уровень представления:

Contains my Views and ViewModels 

2) Бизнес-слой:

Contains my business logic 

3) Уровень данных:

Contains my models 

Мой слой «Презентация» вызывает бизнес-уровень для заполнения локальных копий (хранимых в ViewModel) данных, которые я хочу использовать в моей модели ViewModel/View.

Это достигается с помощью инструкции 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 

Я написал немного больше о некоторых из этого здесь;

https://stackoverflow.com/a/15014599/1305169

+0

Спасибо за подробное объяснение, от того, что я вижу в вашем методе, вы используете контекст каждого метода и располагающие, когда метод закончен, но я думаю, что это противоречит тому, что в статье я связан слишком советы и называет это микроиспользованием контекста вместо того, чтобы позволить контексту жить по методу, позволить ему жить на одного ведущего. –

+1

Да, я основывал свой ответ на рекомендации Microsoft, приведенной здесь ... http://msdn.microsoft.com/en-gb/library/cc853327.aspx, в которой рекомендуется, чтобы Контекст был заключен в оператор 'Using' , – PGallagher

+1

Ваша рекомендация верна, и я буду использовать инструкцию «using» в приложениях MVC внутри метода действия контроллера или внутри метода службы WCF. Plus, ваша ссылка говорит, что если есть привязка, и контекст должен жить для длительность привязки, тогда вы должны утилизировать его вручную. Поэтому я думаю, что это моя ситуация, поэтому я буду рассматривать это как ответ, если кто-то другой не придумает другую идею. –

Смежные вопросы