我一整天都在搜索,无法解决这个问题。我希望以前没有问过。
ObjectFactory.Initialize(
x =>
{
x.For(typeof (IRepository<>))
.Use(typeof(Repository<>))
.CtorDependency<DbContext>("dbContext")
.Is(new DbContext());
}
);
每次创建'Repository'的新实例时,我都需要使用structmap来使用'DbContext'的新实例。现在我相信它正在重用'DbContext'并导致问题。我相信它只重用'DbContext',因为我尝试将'Repository'的生命周期设置为PerRequest,结果相同。任何帮助是极大的赞赏。
我是StructureMap和Dependency Injection的新手,所以我的分析可能不正确。
更新
@PHeiberg非常感谢你的回答。它响了一个铃,我记得看到lambda表达式以'()'开头,这是我以前从未见过的。我很兴奋,就是这样。 我逐字尝试了你的代码,它无法解决Ctor所以我把它改成了这个。
x.For(typeof(IRepository<>))
.HttpContextScoped()
.Use(typeof(Repository<>))
.CtorDependency<DbContext>("dbContext")
.Is(() => new DbContext());
我收到以下编译错误
“无法解析方法'是(Lamda exression)',候选人是:StructureMap.Pipeline.ConfiguredInstance是(对象)(在类ChildInstanceExpression中)StructureMap.Pipeline.ConfiguredInstance是(StructureMap.Pipeline.Instance)(在类ChildInstanceExpression中) 。
在我记得之前我已经看过这条消息,这导致我尝试注册我的dbContext类型,虽然我不知道你是否可以,如果我做得正确,说x.For(具体类型)。使用(具体类型) 。
答案 0 :(得分:0)
您的分析是正确的。您正在配置结构图以使用您传入Is方法的实例,从而有效地创建单例。要为每个Http请求创建一个新实例,请使用:
x.For(typeof (IRepository<>))
.HttpContextScoped()
.Use(typeof(Repository<>))
.Ctor<DbContext>("dbContext")
.Is(() => new DbContext());
注意作为Is参数的lambda。每次解决依赖关系时,它都会导致对创建的评估。 HttpContextScoped方法导致Structure Map在Http请求期间缓存存储库。
答案 1 :(得分:0)
使用
x.For<IRepository>()
.HttpContextScoped()
.Use<Repository>()
.CtorDependency<DbContext>("dbContext")
.Is(ctx => new DbContext());
.Is()
接受一种Func<IContext, T>