2012-04-05 61 views
0

我有一个.NET 4.0 ASP.NET MVC应用程序,它也承载了Workflow Foundation 4.0。在这个工作流程中,一些自定义工作流活动将执行代码,以使用Linq to SQL进行一些数据库更新。代码包括调用一个方法,该方法又调用一些其他方法等......我也有一个业务层,它有一个数据访问工厂,提供对包含数据库操作方法的所有数据访问对象的访问。从工作流活动中访问当前的HttpContext?

现在假设我的WF活动调用方法A,而方法A又调用另一个类中的方法B,该方法在另一个类中调用方法C结束D.在每个这些方法中,我想检索我的数据访问工厂的同一个实例,以便所有数据库操作都在相同的数据库事务中执行。我将如何为我的数据访问工厂设计单例模式?请注意,方法A,B,C和D也可以从Asp.Net MVC控制器调用。当方法A,B,C和D从asp.net mvc控制器中调用时,很容易,我可以使用HttpContext来存储我的数据访问工厂单例,这样在一个http请求中我也可以得到相同的实例我的数据访问工厂。

但是,当从Workflow活动调用这些方法时,当然没有HttpContext。我尝试了线程静态变量,但在Web应用程序中您不确定,方法A,B,C和D将在同一个线程中调用。我也尝试过CallContext,但我经历过,我并不总是检索同一个实例,所以显然CallContext也不是解决方案。

基本上,这个问题可以概括为'在asp.net应用程序中运行的后台进程中获取对象的相同实例'(无论此后台任务是由WF活动启动还是另一种背景任务的方式,例如使用任务<T>)

+0

看看我在那里做了什么? – Will 2012-04-09 11:39:54

回答

1

与您的问题并不真正相关,但在asp.net应用程序中执行后台任务非常糟糕,我从经验中讲述。

The Dangers of Implementing Recurring Background Tasks In ASP.NET

+0

所以正确的解决方案是(如果我正确理解文章)作为Windows服务托管的WCF服务?我可以使用相同的Windows服务来承载工作流主机吗? – rekna 2012-04-05 23:00:49

+0

http://msdn.microsoft.com/en-us/library/ms733069.aspx - 看起来像是可能的。我从来没有做过 – 2012-04-06 13:42:10

1

因为你的对象需要跨越进程和内存空间,我会创建承载您的工厂作为单一实例的WCF服务。这样,MVC应用程序就可以调用它并且WF应用程序可以调用它。

+0

WCF服务中的单例不会工作,因为每个调用都会收到dao工厂的同一个实例。一个dao工厂与一个交易相关联,所以不同的wcf调用会干扰其他交易。所以在WCF服务中,我必须使用CallContext? – rekna 2012-04-05 22:56:09

0

我知道这是旧的,但我想这也会有所帮助。

HttpContext.Current is null when checked on interceptor

其上运行的工作流服务时(.xamlx),要利用的OperationContext与实体对象。

+0

此外,请参阅http://stackoverflow.com/questions/1895732/where-to-store-data-for-current-wcf-call-is-threadstatic-safe 这提供了工作流WCF的.Items字典对象。存储每个WCF实例的实体上下文 – user959729 2012-08-14 14:55:21

相关问题