【问题标题】:StructureMap constructor parameter scopeStructureMap 构造函数参数范围
【发布时间】: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


【解决方案1】:

您的分析是正确的。您正在配置结构映射以使用您传递给 Is 方法的实例,从而有效地创建一个单例。要为每个 Http 请求创建一个新实例,请使用:

x.For(typeof (IRepository<>))
  .HttpContextScoped()
  .Use(typeof(Repository<>))
  .Ctor<DbContext>("dbContext")
  .Is(() => new DbContext());

注意作为 Is 参数的 lambda。每次解决依赖关系时,它都会对创建进行评估。 HttpContextScoped 方法导致结构映射在 Http 请求期间缓存存储库。

【讨论】:

    【解决方案2】:

    使用

    x.For<IRepository>()
        .HttpContextScoped()
        .Use<Repository>()
        .CtorDependency<DbContext>("dbContext")
        .Is(ctx => new DbContext());
    

    .Is() 接受 Func&lt;IContext, T&gt; 的类型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-20
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多