2011-05-02 60 views
3

我有一个的Windows服务(或Windows窗体),当一个计时器过后,我的服务完成一些任务。实体框架+生活时间+结构图+工作单元+ Windows窗体?

只要我的应用程序正在运行,我不想仅使用一个实体框架上下文

我看到会话工厂在NHibernate样本。有没有像EF

这是我如何使用EF + StructureMapASP.NET MVC或应用

应用程序启动:

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

结束请求:

ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects() 

的UnitOfWork已启动每个Web请求,并配置请求结束之后。

在我赢应用场景UOW当定时器经过和布置我的工作是完整的,我不想处理它自己之后应该开始。

我该如何在Windows窗体应用程序中实现这样的功能?

如果我用我的注册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。结构图需要我的车DatabaseFactoryUoW终身网络情景。但我不知道赢得应用程序该做什么。我可以管理自己的生命周期我自己,但我正在寻找一种方式,以便StructureMap将处理它我为,因为它处理Web应用程序的生命周期。

+0

Afshin我有类似的问题像你的。你能分享你的最终解决方案吗? – Shahin 2013-04-08 14:36:00

+0

@shaahin:我目前的解决方案并不完美。我会尽力将它添加到这篇文章尽快。在web应用程序中,请求的开始和结束由框架指示,但在Windows应用程序中不是这样的,所以我手动进行并且模拟它。例如:在某个按钮的点击处理程序方法(在赢取应用程序)中,我正在向自己的基础结构发出一个请求的开始和结束的信号。 – 2013-04-09 02:41:08

回答

4

ASP.Net提供用于管理您的objectcontext生命周期的基础设施(基本上每个请求一个httpcontext)。在winforms中显然没有类似的东西。因此,管理EF上下文的方式将高度依赖于您的应用程序的体系结构。例如,如果您有MVP或MVVM风格的应用程序,则可以将上下文的生命周期与Presenter或ViewModel的生命周期相耦合。或者你可以选择一个'用户故事'的抽象概念,并将你的对象上下文的生命周期和它结合起来。这真的取决于。

为灵感,look at this article by Ayende(它是关于与NHibernate会话管理,但其概念是相同的。想想NHibernate的会议==实体框架的ObjectContext)

+0

感谢您的回复。我读过你提到的文章。问题是:在Web应用程序中,结构图会为每个会话启动并处理我的UoW。在win应用程序中,结构图会为每个线程启动一个UoW,如果我管理它的生命时间并在我的主持人被释放后处理它,Uow就会消失,但线程仍然活着!我想我应该更多地关注结构图,正如你所说,它高度依赖于我的应用程序的体系结构。 – 2011-05-03 15:41:22

+0

@Ashshin Gh我不认为应该由IoC容器来管理uow生命周期,它应该是明确的(至少在桌面应用程序中 – jeroenh 2011-05-11 17:56:54

+0

是的,我找不到更好的方法,看起来我必须管理它我自己在赢取应用程序,我会等待一些其他答案(并投票了你的答案) – 2011-05-11 20:12:10

1

Web应用程序是无国籍,相反桌面应用状态。在网络中,对象通常是按照每个请求创建的,并同样被处理掉。这样做的原因有很多(如处理多个请求和有限的内存量等),这就是为什么您拥有所有基础架构的原因。在桌面上,您可以将所有内容存储在内存中。

因此,在桌面应用程序中,您需要手动执行会话管理(通常是每个商业交易)。

UPDATE:this post对会议相关代码

+0

我完全意识到网络和赢得应用程序之间的差异在NHibernate中你有Session Factory,什么是平等的EF? – 2011-05-10 22:48:03

+0

@Ashshin对不起,对于一个毫无意义的答案抱歉。也许你可以看到这篇文章呢?http://peplowdown.wordpress.com/2010/07/05/repository-pattern-in-entity-framework-4-0/这个家伙在EF里创建了会话工厂和会话。 – oleksii 2011-05-11 10:36:43

+0

你链接的文章并不是我想要的,但它是有用的。我感谢你的帮助,我投了你的答案,我会等待别人投票。并回答。 – 2011-05-11 17:00:15

1

实体框架为您提供了“语境”,这是一种会话与自身内部工作单元的范围,对于一个上下文中完成所有的操作仍然是语境的范围。而实体框架已经实现了Unit Of Work模式。 EF还实现了身份映射,因此对于一个主键,您将只能在导航属性中找到任何引用的唯一对象。

对于桌面应用程序,您只需要维护一个上下文,这将是所有操作的范围,并将所有操作存储在正确的状态直到您调用SaveChanges。

对于Web应用程序,您可以将您的上下文放在Session的Session中。NET,这可能会增加服务器的负载,但它可能允许您存储更长时间的更改,然后只是一个页面。

只要我的应用程序正在运行,我不想只使用一个实体框架上下文。

只要应用程序正在运行,上下文有什么问题?相反,这是做到这一点的正确方法。保持一个上下文并不意味着你保持与活着的数据库的连接。仅在查询和保存更改时才打开和关闭数据库连接。

如果你的应用程序出现一些不平衡并导致内存问题,最好的办法是只分配新的上下文并刷新你的UI,它会把所有旧的上下文和它的对象放入垃圾回收器,你的新上下文将为你服务内存较少。

+0

只要我的win应用程序正在运行,我不喜欢让我的上下文保持活跃状态​​。当我需要时启动我的UoW并在完成工作后关闭它,对我来说更好。但你是完全正确的,你的答案是有用的。投了赞成票。 – 2011-05-17 18:56:57

+0

ObjectContext并不是一个长寿命的对象。这是不是一个最好的做法,保持它活着(因为你查询的所有东西都保持缓存,所以它保持更长时间的机会变得更大,你会看到多用户环境中的陈旧数据) – jeroenh 2011-05-17 20:39:42

+0

@jeroenh,如果你看我的答案,我并不建议任何人在多用户环境中长时间保持ObjectContext,对于单用户来说,最好也是最可取的方法是让它长期存在,因为无论如何你都将对象保存在内存中,编辑。 – 2011-05-18 09:04:38