【问题标题】:Cannot access a disposed object.\r\nObject name: 'DataContext accessed after Dispose'无法访问已释放的对象。\r\n对象名称: 'DataContext 在 Dispose 之后访问'
【发布时间】:2015-05-25 17:39:26
【问题描述】:

我正在为 Web API 2 项目使用 StructureMap.WebApi2 nuget 包来管理依赖注入。 在 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对象名称: 'DataContext 在 Dispose 后访问'

如果我对Datacontext 使用Singleton 或ThreadLocalStorageLifecycle 范围,它工作正常。但我想将 DataContext 对象的范围限定为每个 Http 请求。

如何将Datacontext 对象限定为每个 Http 请求?

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

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

【问题讨论】:

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


    【解决方案1】:

    取决于您用于 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 包 Structuremap.MVC4、Structuremap.MVC5 和 Structuremap.WebAPI2 使用 Structuremap 的嵌套容器。

    【讨论】:

    • 嗨 Jota..我正在使用嵌套容器。使用 StructureMap.WebApi2 nuget 包。我只对具有默认瞬态范围的 Linq to Sql DataContext 对象有问题。收到错误“无法访问已释放的对象。\r\n对象名称:'DataContext 在 Dispose 后访问”。如果我使用 LifecycleIs() 它可以工作。但是将数据上下文存储在 Thread 本地存储中可能会导致问题,因为应根据请求创建数据上下文。请建议。提前致谢。
    • 嗯,这很奇怪。嵌套上下文中的瞬态生命周期用于为容器中的所有瞬态分辨率共享对象的同一实例。仅当嵌套容器被处置时才会发生处置。单例生命周期使用父容器单例,因此不会被释放。我不知道线程本地存储是如何实现的,但我认为它使用了父容器。你确定你的依赖没有被其他地方处理吗?为什么不在自己的 DbContext 中实现 IDisposable,设置断点并查看堆栈跟踪?
    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2022-01-11
    • 2020-04-23
    • 2017-12-24
    • 1970-01-01
    相关资源
    最近更新 更多