2009-01-19 60 views
5

我们使用我们编写的企业框架来促进我们所做的各种公司特定的事情。C#,Winforms&LINQ to SQL .. Datacontext生命周期?

在框架内,我们提供了一个LINQ to SQL ORM以在适当的时候使用。所有这些都基于Microsoft MVC框架。在MVC方面,我们在基础控制器中创建了一个数据上下文。这使我们有一个完整的数据上下文生命周期,这对于事务非常有用。

我们希望完成的一项任务是提供Winforms支持。

但是,我正在撞墙,试图找出一种方法,以类似于Winforms的方式工作。

鉴于MVC方法非常简单,因为一个页面加载代表了逻辑事务,所以很难在Winforms方面提出解决方案。

有没有人做过类似的事情或有任何建议?

回答

2

我对去年建立的一些小软件做了类似的事情。

我们创建了一个应用程序shell,它可以类似于请求/响应模型加载表单。

我建立了一个IRenderer接口,我用RenderView()方法实现了web和windows窗体。它允许我为两者使用相同的控制器和模型。在goodle上搜索Model-View-ViewModel(MVVM),你可能会发现这种方法。我认为this article可能会帮助你理解我在说什么。

+0

非常感谢您的信息! – 2009-01-19 21:12:48

3

如果您正在考虑选择具有长寿命的DataContext(例如作为应用程序中的Singleton)还是具有短期DataContexts,我会选择第二个。我会为每个“工作单元”new()一个DataContext,并确保尽可能短地保持它活着。创建新的DataContext不是一个大问题,因为它们无论如何都缓存元数据。拥有一个长期存在的DataContext,当它开始跟踪许多对象时,会给你一点噩梦。

+0

+1单位的工作是这里的关键词。桌面应用程序仍在执行不同的业务交易,这些业务交易可以并且应该分成不同的工作单元。这些应该控制datacontext的生命周期 – 2009-01-20 21:20:13

0

只有一个datacontext的问题是你不能有多个打开的编辑,只提交一个。对于很多应用程序模型来说,这是一个非启动器。因此,我有一个用于读取的单例数据环境,并为每个提交操作创建一个。更新函数将要保存的对象从读取的datacontext中分离出来,并将它们附加到新的提交数据上下文中,然后运行DC.Submit更改。

唯一棘手的是有一种方法来跟踪对象是否应该在提交时插入或插入时进行更新,以及如果您有标准的auto num主键或在某个集合中管理哪个列应该作为检查插入与更新的类别,这是相当微不足道的。

+0

Downvoted用于保持读取的长期数据上下文。这是收集陈旧数据的好方法。是的,你可以刷新,但是你保存数据会失去任何性能收益。只有在需要获取或放置数据时才使用上下文也简化了记录保存,并且不需要担心是否插入或更新对象。 (如果你有一个标识栏,你可以检查它的内容,无论如何......如果它没有被写入,则没有任何内容。) – 2009-12-17 19:25:39

0

我知道这个线程有点老,但在unhaddins中我们有一个Conversation-per-BusinessTransaction的实现。目前我们只有nhibernate的实现,但是将它用于Linq到sql或实体框架应该很简单。 查看我在list的回答。