Entity Framework + Life Time + StructureMap + Единица работы + Windows Forms? - PullRequest
3 голосов
/ 02 мая 2011

У меня есть служба Windows (или Windows Forms) , и по истечении таймера моя служба выполняет некоторые задачи.

Я не хочу использовать только один контекст Entity Framework , пока мое приложение работает.

Я видел фабрику сессий в NHibernate образцов.Есть ли что-то подобное для EF ?

Вот как я использую EF + StructureMap в моем ASP.NET илиMVC apps:

Запуск приложения:

ObjectFactory.Configure(Function(config) config.For(Of IUnitOfWork).HybridHttpOrThreadLocalScoped.Use(Of UnitOfWork)())

Запрос на завершение:

ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects()

My UnitOfWork запускается за веб-запрос и удаляется после завершения запроса.

В моем Win App сценарии , UoW должно начаться, когда таймер истечет и будет утилизирован после завершения моей работы, и Я не хочу справляться с этим сам.

Как я могудобиться чего-то подобного в приложении Windows Form?

Если я зарегистрирую свой UoW с помощью: HybridHttprThreadLocalScoped В нити будет одно UoW и если я утилизирую это, это ушло .

РЕДАКТИРОВАТЬ:

У меня есть хранилища + службы в 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 life в web сценариях.Но я понятия не имею, что делать в приложениях win .Я могу управлять временем жизни UoW сам , но я ищу способ, чтобы StructureMap обработал бы его для меня , как он обрабатывает время жизни в веб-приложениях.

Ответы [ 3 ]

4 голосов
/ 03 мая 2011

ASP.Net предоставляет инфраструктуру (по сути, один httpcontext на запрос) для управления временем жизни вашего объектного контекста. В winforms (очевидно) нет ничего похожего. Поэтому способ управления контекстом EF будет сильно зависеть от архитектуры вашего приложения.

Например, если у вас есть приложение в стиле MVP или MVVM, вы можете связать время жизни своего контекста со временем жизни Presenter или ViewModel. Или вы можете использовать абстрактную концепцию «пользовательской истории» и связать с ней время существования вашего объекта контекста. Это действительно зависит.

Для вдохновения, посмотрите на эту статью Ayende (речь идет об управлении сессиями с помощью NHibernate, но концепции те же. Подумайте NHibernate Session == Entity Framework ObjectContext)

1 голос
/ 17 мая 2011

Entity Framework предоставляет вам «Контекст», который является своего рода сеансом с объемом работ внутри себя, все операции, выполняемые для одного контекста, остаются в области контекста. И Entity Framework уже реализует шаблон Unit Of Work. EF также реализует карту идентичности, поэтому для одного первичного ключа вы найдете только один объект, на который есть ссылка везде в свойстве навигации.

Для настольного приложения вы должны поддерживать только один Контекст, который будет охватывать все операции, и он будет хранить все операции в правильном состоянии, пока вы не вызовете SaveChanges.

Для веб-приложения вы можете поместить свой контекст в Session of ASP.NET, что может увеличить нагрузку на сервер, но может позволить вам хранить изменения в течение более длительного периода времени, чем одна страница.

Я не хочу использовать только один контекст Entity Framework, пока мое приложение работает.

Что не так с одним контекстом, пока приложение работает? Вместо этого это правильный способ сделать это. Поддержание одного контекста не означает, что вы поддерживаете связь с базой данных. Соединения с базой данных открываются и закрываются только во время запроса и сохранения изменений.

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

1 голос
/ 11 мая 2011

Веб-приложения без состояния , в отличие от настольных приложений с состоянием .В сети объекты обычно создаются для отдельных запросов и утилизируются аналогичным образом.Есть много причин, почему это делается таким образом (например, обработка нескольких запросов, ограниченный объем памяти и т. Д.), Поэтому у вас есть вся инфраструктура, готовая к этому.В настольном компьютере вы можете хранить все в памяти.

Следовательно, в настольном приложении вам потребуется реализовать управление сеансом вручную (обычно для каждой бизнес-транзакции).

ОБНОВЛЕНИЕ: этот пост имеет соответствующий код на сессиях

...