无法访问已处置的对象。\ r \ n对象名称:'在Dispose'之后访问的DataContext

时间:2015-05-25 17:39:27

标签: entity-framework dependency-injection asp.net-web-api2 dbcontext structuremap3

我正在使用StructureMap.WebApi2 nuget包进行Web API 2项目来管理依赖注入。 在DefaultRegistry.cs类中,我提到了所需的所有依赖项 嵌套容器用于每个请求。

For<IScoreRepository>().Use<ScoreRepository>();
 For<IExternalUsersAuditRepository>().Use<ExternalUsersAuditRepository>();
 For<ITestScanService>().Use<TestScanService>();


 // hook up specific questionnaire datacontext
 For<SportsDataContext>().LifecycleIs(new HttpContextLifecycle())
   .Use(c => new SportsDataContext(
     ConfigurationManager.ConnectionStrings["Database"].ConnectionString));

// hook up datacontext for data and services
For<QuestionDataContext>().LifecycleIs(new HttpContextLifecycle())
  .Use(c => new QuestionDataContext(
     ConfigurationManager.ConnectionStrings["Database"].ConnectionString));

在结构图的早期版本中,HttpContextScoped可用但是最新版本3.0.0.0已经不再可用,因此我将LifeCycle设置为HttpContextLifeCycle。

Linq to Sql Datacontext对象正在处理,我收到以下错误:

  

无法访问已处置的对象。\ r \ n对象名称:&#39; Dispose&#39;

后访问的DataContext

如果我使用SingletonThreadLocalStorageLifecycle范围来Datacontext它的工作正常。但我想将DataContext对象的范围限定为Per Http Request。

如何根据Http请求确定Datacontext对象的范围?

我参考了以下文章,但它不适用于HttpContextLifeCycle

http://ignipro.blogspot.in/2012/09/structuremap-scopes-and-life-cycles.html

1 个答案:

答案 0 :(得分:0)

取决于您用于Web API2的托管旧版

来自http://structuremap.github.io/object-lifecycle/supported-lifecycles/#aspnet

  

StructureMap团队强烈建议不要使用旧的ASP.Net生命周期。 .Net中的大多数现代Web框架将根据请求使用嵌套容器以更好的方式完成相同的范围。

你应该使用的是:

StructureMap - Nested Containers (Per Request/Transaction)

您可以阅读此博客文章,其中介绍了如何逐步实施该文章:

Utilizing Structuremap 3 with ASP.NET MVC

最简单的答案是Nuget Packages Structuremap.MVC4,Structuremap.MVC5和Structuremap.WebAPI2使用Structuremap的嵌套容器。