【发布时间】:2013-06-14 21:34:58
【问题描述】:
我已经搜索了一整天,但无法弄清楚。我希望它以前没有被问过。
ObjectFactory.Initialize(
x =>
{
x.For(typeof (IRepository<>))
.Use(typeof(Repository<>))
.CtorDependency<DbContext>("dbContext")
.Is(new DbContext());
}
);
每次创建“存储库”的新实例时,我都需要结构映射来使用“DbContext”的新实例。现在我相信它正在重用“DbContext”及其导致的问题。我相信它只重用了“DbContext”,因为我尝试将“存储库”上的生命周期设置为 PerRequest,结果相同。任何帮助是极大的赞赏。
我是 StructureMap 和依赖注入的新手,所以我的分析可能不正确。
更新
@PHeiberg 非常感谢您的回答。它敲响了警钟,我记得看到过以“()”开头的 lambda 表达式,这是我以前从未见过的。我非常兴奋,就是这样。 我逐字尝试了您的代码,但它无法解析 Ctor,所以我将其更改为这个。
x.For(typeof(IRepository<>))
.HttpContextScoped()
.Use(typeof(Repository<>))
.CtorDependency<DbContext>("dbContext")
.Is(() => new DbContext());
我收到以下编译错误
"无法解析方法'Is(Lamda exression)',候选对象是:StructureMap.Pipeline.ConfiguredInstance Is(object)(在 ChildInstanceExpression 类中) StructureMap.Pipeline.ConfiguredInstance Is(StructureMap.Pipeline.Instance)(在 ChildInstanceExpression 类中) .
在我记得之前我已经看到了这条消息,它导致我尝试注册我的 dbContext 类型,尽管我不知道你是否可以,也不知道我是否做得正确,比如 x.For(concrete type).Use(concrete type) .
【问题讨论】:
-
我根本不知道 StructureMap,但看看你的代码,我猜它总是使用你在注册
Repository时创建的DbContext实例(或者当委托被调用时) - 可能一次用于您的应用程序)。如果您希望您的容器控制DbContext的生命周期,您可能需要单独注册它。
标签: .net entity-framework structuremap