0

我正在为 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 后访问'

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

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

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

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

4

1 回答 1

0

根据您用于 Web API2 的主机,旧的

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

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

你应该使用的是:

StructureMap - 嵌套容器(每个请求/事务)

您可以阅读这篇博文,其中解释了如何逐步实现它:

在 ASP.NET MVC 中使用 Structuremap 3

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

于 2015-05-26T08:30:40.623 回答