2011-04-21 87 views
1

我一直在搜索整天,无法弄清楚这一点。我希望以前没有问过。StructureMap构造函数参数范围

ObjectFactory.Initialize(
    x => 
     { 
      x.For(typeof (IRepository<>)) 
      .Use(typeof(Repository<>)) 
      .CtorDependency<DbContext>("dbContext") 
      .Is(new DbContext()); 
     } 
    ); 

我需要结构图来在每次创建'Repository'的新实例时使用'DbContext'的新实例。现在我相信它正在重用'DbContext'及其引发的问题。我相信它只是重复使用'DbContext',因为我已经尝试将'Repository'的生命周期设置为PerRequest,结果相同。任何帮助是极大的赞赏。

我是新来的StructureMap和依赖注入,所以我可能在我的分析不正确。

更新

@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

我不知道StructureMap可言,但看着你的代码,我猜它总是用你的'DbContext'实例在注册'Repository'时创建(或者当委托被调用时 - 可能只有一次为你的应用程序)。如果你想让你的容器控制'DbContext'的生命周期,你可能需要单独注册它。 – 2011-04-21 02:24:46

回答

0

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

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

注意的拉姆达那是被论证。它会在每次解决依赖关系时完成对创建的评估。 HttpContextScoped方法会导致结构映射在Http请求期间缓存Repository。

0

使用

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

.Is()接受一个类型的Func<IContext, T>