【发布时间】:2011-05-02 17:35:57
【问题描述】:
我有一个 windows 服务(或 Windows 窗体),当计时器到时,我的服务会完成一些任务。
只要我的应用正在运行,我就不想只使用一个实体框架上下文。
我看到了 NHibernate 中的会话工厂 示例。 EF 有类似的东西吗?
以下是我在 ASP.NET 或 MVC 应用程序中使用 EF + StructureMap 的方法:
应用开始:
ObjectFactory.Configure(Function(config) config.For(Of IUnitOfWork).HybridHttpOrThreadLocalScoped.Use(Of UnitOfWork)())
结束请求:
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects()
我的UnitOfWork是根据网络请求启动的,并在请求结束后处置。
在我的 Win App 场景中,UoW 应该在计时器经过并在我的工作完成后处置并且 我不想处理它时启动我自己。
如何在 Windows 窗体应用程序中实现类似的功能?
如果我使用 HybridHttprThreadLocalScoped 注册我的 UoW,每个线程只有一个 UoW,如果我丢弃它,它就消失了。
编辑:
我在 dll 中有我的存储库 + 服务,我想在 web 或 win 应用程序中使用它们,正因为如此我用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 在 web 场景中接管了我的 DatabaseFactory 和 UoW 生命周期。但我不知道在 win apps 中该做什么。我可以管理 UoW 我自己的生命周期,但我正在寻找一种方法,以便 StructureMap 为我处理它,因为它可以处理网络应用程序中的生命周期。
【问题讨论】:
-
Afshin 我也有类似的问题。你能分享你的最终解决方案吗?
-
@shaahin:我目前的解决方案并不完美。我会尽快将其添加到此帖子中。在网络应用程序中,请求的开始和结束由框架发出信号,但在 Windows 应用程序中,情况并非如此,所以我手动进行并模拟它。例如:在某个按钮的单击处理程序方法(在 win 应用程序中)我正在向我自己的基础架构发出请求的开始和结束信号。
标签: c# .net entity-framework structuremap unit-of-work