将动态参数传递给Ninject(或任何容器)中的工厂/组合根

时间:2012-01-30 16:03:53

标签: dependency-injection ninject ioc-container

这是一个例子。

foreach (var doc in documents)
{
    var processor = this.factory.Create();
    processor.Process(doc);
}

factory内部调用kernel.Get<IDocumentProcessor>()

我希望所有文档处理器的依赖项的生命周期都“限定”到此组合根目录。这种配置似乎符合我的要求:

kernel.Bind<IEntityContext>().To<EntityContext>().InCallScope();

现在,以文档处理器为根的每个对象图都有一个唯一的共享实体上下文,用于访问数据库。但是这个

  1. 影响应用程序中所有实体上下文(可能没问题,但似乎很难发现),
  2. 似乎只适用于静态已知的绑定。
  3. 我认为我的问题是,如何通过“上下文”或动态信息实现相同的范围/生命周期管理效果?也许我希望将文档实例本身注入到新根的所有子项中:

        var processor = this.factory.Create(doc)
        processor.Process()
    

    谢谢!

1 个答案:

答案 0 :(得分:1)

使用Ninject 3.0.0,你可以做到

kerne.Get<IProcessor>(new ConstructorArgument("doc", doc, true));

但对我来说,似乎还有一个设计缺陷,即将doc作为处理器的依赖。通过将文档传递给Process方法,最好创建一次处理器并将其重用于多个文档。由于问题没有显示实际问题,我仍然没有得到这个问题。