Dependency injection 向注入的依赖项注入值

Dependency injection 向注入的依赖项注入值,dependency-injection,ninject,Dependency Injection,Ninject,我有这样的经历: 类根目录 { 公共根(独立性部) {} } 类依赖性:IDependency { 公共依赖项(int-val) {} } 我正在尝试使用ninject获取对Root的引用。 所以我像这样配置它 var module=newinlinemodule(mod=>mod.Bind().To()); var内核=新的标准内核(模块); 我想向依赖项注入一些“val”值,这些值只有在从ninject获取根引用时才知道 我想做的是这样的: Kernel.Instance.Get(Wit

我有这样的经历:

类根目录
{
公共根(独立性部)
{}
}
类依赖性:IDependency
{
公共依赖项(int-val)
{}
}
我正在尝试使用ninject获取对Root的引用。 所以我像这样配置它

var module=newinlinemodule(mod=>mod.Bind().To());
var内核=新的标准内核(模块);
我想向依赖项注入一些“val”值,这些值只有在从ninject获取根引用时才知道

我想做的是这样的:

Kernel.Instance.Get(With.Parameters.ConstructorArgument(“val”,12));

使用ninject 1.0是否可以实现类似的功能?

上下文中的
参数。默认情况下,上下文中的构造函数参数只深入一层

将参数向下传递到多个级别的一种方法是使用ContextParameter,但是需要抓住它并说——现在我们将使用它作为 本例中的构造函数参数。一个这样的构造是提供者。看

因此,您可以:

class dependencProvider:SimpleProvider
{
受保护的覆盖依赖项CreateInstance(IContext上下文)
{
返回新的依赖项((int)context.ParentContext.Parameters.GetOne(“masterVal”).Value);
}
}
公共静态void Main()
{
var模块=新的InlineModule(
mod=>mod.Bind().ToProvider(新的DependencyProvider())
);
var kernel=新的标准内核(新[]{module});
Root=kernel.Get(带有.Parameters.ContextVariable(“masterVal”,12));
}
或者,您可以按如下方式管理它:

类根提供者:SimpleProvider
{
受保护的覆盖根CreateInstance(IContext上下文)
{
返回新根目录(context.Kernel.Get(With.Parameters.ConstructorArgument(“val”),(int)context.Parameters.GetOne(“masterVal”).Value));
}
}
公共静态void Main()
{
var模块=新的InlineModule(
mod=>mod.Bind().To(),//如果ImplictSelfBinding处于启用状态,则为可选
mod=>mod.Bind().ToProvider(新的RootProvider())
);
var kernel=新的标准内核(新[]{module});
Root=kernel.Get(带有.Parameters.ContextVariable(“masterVal”,12));
}

当您在考虑这个问题时, < P>用NIXECT 3代码> IValueS(<代码>构造参数< /代码>是其中之一)现在将简单地“继承”到子请求时,他们有<代码>应继承(=真)< /> >(参见)。 这个问题的解决方案现在可以简单到:

IResolutionRoot.Get<Root>(new ConstructorArgument("val", 12, true));
IResolutionRoot.Get(新的构造函数参数(“val”,12,true));

其中,
ConstructorArgument
s构造函数中的
true
ShouldInherit
设置为
true
。另请参见

我想我可以做得更简单一些,比如:Bind().To().WithConstructorArgument(“val”),(IContext cont)=>cont.ParentContext.Parameters.Get(“val”);但是我不喜欢使用ParentContext( It@Silviu:试试看-越短越好。对我来说,直接按你的要求去做似乎是有道理的,但在我尝试的环境中,我无法让它对我起作用。@Silviu:你把它作为
Bind
workout的一部分来做了吗?如果是这样,如果你想把一些有用的东西放到注释中,我会把它放到例子。很抱歉为后期的反应。我尝试了父上下文。它工作。不太骄傲。D可能是我的观点的错误,但是当我定义绑定时,我告诉NICATE使用一些键值对。在那一刻,出于某种原因,我期望为整个依赖链考虑那些值,因为那是TH。正在使用e上下文。事实上,我认为上下文代表Ninject构建东西所基于的媒介。因此,一旦为某个类定义了上下文,它就应该为所有dep使用该上下文。每个dep的绑定都添加到相同的上下文中。我真的不喜欢父对象。感觉我需要在绑定级别了解太多关于依赖关系的层次结构。我的意思是,如果我在根和依赖关系之间放置另一层呢?那么我必须修改依赖关系到context.ParentContext.ParentContext的绑定,这是一种非常丑陋的耦合。