StructureMap构造函数参数范围

时间:2011-04-21 02:12:56

标签: .net entity-framework structuremap

我一整天都在搜索,无法解决这个问题。我希望以前没有问过。

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(具体类型)。使用(具体类型) 。

2 个答案:

答案 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>