У меня есть служба Windows (или Windows Forms) , и по истечении таймера моя служба выполняет некоторые задачи.
Я не хочу использовать только один контекст Entity Framework , пока работает мое приложение.
Я видел фабрику сеансов в образцах NHibernate . Есть ли что-нибудь подобное для EF ?
Вот как я использую EF + StructureMap в своих приложениях ASP.NET или MVC :
Запуск приложения:
ObjectFactory.Configure(Function(config) config.For(Of IUnitOfWork).HybridHttpOrThreadLocalScoped.Use(Of UnitOfWork)())
Завершить запрос:
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects()
Мой UnitOfWork запускается по веб-запросу и удаляется после завершения запроса.
В моем сценарии приложения Win , UoW должен запускаться по истечении таймера и удаляться после завершения моей работы, а я не хочу обрабатывать это сам. < / сильный>
Как добиться этого в приложении Windows Form?
Если я зарегистрирую свой UoW, используя: HybridHttprThreadLocalScoped
Есть только один UoW на поток , и если я утилизирую его, он исчез .
< EM> EDIT :
У меня есть репозитории + службы в dll , и я хочу использовать их как в веб-приложениях, так и в приложениях для выигрыша , поэтому я использовал HybridHttpOrThreadLocalScoped
.
Обновление 2:
Вот мой репозиторий :
Public Class ProductRepository
Private ReadOnly _databaseFactory As DataAccess.IDatabaseFactory
Public Sub New(ByVal databaseFactory As DataAccess.IDatabaseFactory)
_databaseFactory = databaseFactory
End Sub
Public Function GetById(ByVal id As Integer) As Product
Return (From item In _databaseFactory.GetDataContext.Products Where item.ProductId = id).FirstOrDefault
End Function
End Class
А вот и моя Служба :
Public Class ProductService
Private ReadOnly _Repository As ProductRepository
Public Sub New(ByVal repository As ProductRepository)
_Repository = repository
End Sub
Public Function GetById(ByVal id As Integer) As Product
Return _Repository.GetById(id)
End Function
End Class
И я использую StructureMap . StructureMap использует мои DatabaseFactory и время жизни UoW в веб-сценариях . Но я понятия не имею, что делать в выигрышных приложениях . Я могу управлять временем жизни UoW сам , но я ищу способ, чтобы StructureMap справился с этим за меня , поскольку он обрабатывает время жизни в веб-приложениях.
3 ответа
ASP.Net предоставляет инфраструктуру (по сути, один httpcontext на запрос) для управления временем жизни вашего объектного контекста. В winforms (очевидно) нет ничего похожего. Таким образом, способ управления контекстом EF будет сильно зависеть от архитектуры вашего приложения.
Например, если у вас есть приложение в стиле MVP или MVVM, вы можете связать время жизни вашего контекста со временем жизни Presenter или ViewModel. Или вы можете использовать абстрактную концепцию «пользовательской истории» и связать с ней время жизни вашего объектного контекста. Это действительно зависит от обстоятельств.
Для вдохновения просмотрите эту статью Айенде (она об управлении сеансами с NHibernate, но концепции те же. Подумайте NHibernate Session == Entity Framework ObjectContext)
Веб-приложения не имеют состояния , а настольные приложения - с отслеживанием состояния . В сети объекты обычно создаются по запросу и удаляются аналогичным образом. Есть много причин, по которым это делается таким образом (например, обработка нескольких запросов, ограниченный объем памяти и т. Д.), Поэтому у вас есть для этого готовая вся инфраструктура. На рабочем столе вы можете хранить все в памяти.
Следовательно, в настольном приложении вам нужно будет реализовать управление сеансом вручную (обычно для каждой бизнес-операции).
ОБНОВЛЕНИЕ: этот пост имеет соответствующий код на сеансах
Entity Framework предоставляет вам «Контекст», который является своего рода сеансом с областью действия единицы работы внутри себя, все операции, выполняемые для одного контекста, остаются в области действия контекста. И Entity Framework уже реализует шаблон Unit Of Work. EF также реализует карту удостоверений, поэтому для одного первичного ключа вы найдете только один объект, на который есть ссылка везде в свойстве навигации.
Для настольного приложения вам нужно поддерживать только один контекст, который будет областью всех операций, и он хранит все операции в правильном состоянии до тех пор, пока вы не вызовете SaveChanges.
Для веб-приложения вы можете поместить свой контекст в сеанс ASP.NET, что может увеличить нагрузку на сервер, но может позволить вам хранить изменения дольше, чем на одной странице.
Я не хочу использовать только один контекст Entity Framework, пока работает мое приложение.
Что не так с одним контекстом, пока приложение работает? Напротив, это правильный способ сделать это. Сохранение одного контекста живым не означает, что вы поддерживаете соединение с базой данных. Соединения с базой данных открываются и закрываются только при запросе и сохранении изменений.
Если ваше приложение немного выходит из равновесия и вызывает проблемы с памятью, лучшим способом было бы просто выделить новый контекст и обновить пользовательский интерфейс, он поместит весь старый контекст и его объекты в сборщик мусора, и ваш новый контекст будет обслуживать вас с меньшим объемом памяти.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.