我正在使用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
如果我使用Singleton
或ThreadLocalStorageLifecycle
范围来Datacontext
它的工作正常。但我想将DataContext
对象的范围限定为Per Http Request。
如何根据Http请求确定Datacontext
对象的范围?
我参考了以下文章,但它不适用于HttpContextLifeCycle
:
http://ignipro.blogspot.in/2012/09/structuremap-scopes-and-life-cycles.html
答案 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的嵌套容器。