Linq to sql 使用DataContextFactory在WCF服务中管理Linq到SQL Datacontext

Linq to sql 使用DataContextFactory在WCF服务中管理Linq到SQL Datacontext,linq-to-sql,datacontext,factory,instancecontextmode,Linq To Sql,Datacontext,Factory,Instancecontextmode,我一直在ASP.Net应用程序使用的数据层中使用Rick Strahl的DataContextFactory代码()。它工作得很好,因为当前datacontext存储在HttpContext.Items集合中。我知道我在为每个web请求重用相同的datacontext 但是,我无法在WCF服务中成功使用工厂。在非HttpContext应用程序上,工厂将datacontext存储在线程数据槽中 Thread.AllocateNamedDataSlot(key) 问题是,无论我如何在服务中设置Co

我一直在ASP.Net应用程序使用的数据层中使用Rick Strahl的DataContextFactory代码()。它工作得很好,因为当前datacontext存储在HttpContext.Items集合中。我知道我在为每个web请求重用相同的datacontext

但是,我无法在WCF服务中成功使用工厂。在非HttpContext应用程序上,工厂将datacontext存储在线程数据槽中

Thread.AllocateNamedDataSlot(key)
问题是,无论我如何在服务中设置ConcurrencyMode和InstanceContextMode,每次调用都会重用线程,并重用相同的dataContext。我不要这个。我只希望每个服务方法调用存在一个datacontext。有没有什么方法可以通过工厂来实现?我无法在每个客户端调用上找到任何唯一的信息来用作我的datacontext的标识符,因此它不会被其他请求重用…无论它是否是同一个客户端

我希望使用我的业务层,而不是直接访问我的数据层,但我担心我可能不得不在我的WCF服务中指定我自己的工作单元和数据上下文。有没有人在WCF服务中使用某种工厂作为他们的数据上下文?我希望有一种方法让我的工厂知道它是否被WCF服务使用,然后唯一地处理datacontext的存储

public static T GetScopedDataContext<T>()
{
    if (HttpContext.Current != null)
        return (T)GetWebRequestScopedDataContextInternal(typeof(T), typeof(T).ToString(), null);

    // What can I put here to handle WCF services differently?
    return (T)GetThreadScopedDataContextInternal(typeof(T), typeof(T).ToString(), null);
}
我也有同样的问题。 我使用Castle.Windsor IOC container+“PerWebRequest”的生活方式,它的工作方式与您的引擎盖下的工厂类似

我仍在努力找到满足我需求的完美解决方案,但我有一个中间解决方案可以帮助您:让您的WCF服务与HttpContext一起运行:

1) 在WCF项目中,询问ASP.Net兼容性

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class MyService : IMyContract
{
  ...
}
资料来源:

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class MyService : IMyContract
{
  ...
}