8

我有这样的事情:

class Root
{
    public Root(IDependency dep)
    {}
}
class Dependency:IDependency
{
    public Dependency(int val)
    {}
}

我正在尝试使用 ninject 获取对 Root 的引用。所以我像这样配置它

var module = new InlineModule(mod => mod.Bind<IDependency>().To<Dependency>());

var kernel = new StandardKernel(module);

我想向 Dependency 注入一些“val”值,该值仅在从 ninject 获取 Root 引用时才知道。

我想做的是这样的:

Kernel.Instance.Get<Root>(With.Parameters.ConstructorArgument("val", 12));

使用ninject 1.0可以实现这样的事情吗?

4

2 回答 2

8

默认情况下Parameters.ConstructorArgument,上下文仅深一层。

将参数向下传递多个级别的一种方法是使用 ContextParameter,但随后需要抓住它并说 - 现在我们将在这种情况下将其用作 ConstructorArgument。一种这样的构造是提供者。有关提供者的详细信息,请参阅此 dojo 页面

所以你可以这样做:

    class DependencyProvider : SimpleProvider<Dependency>
    {
        protected override Dependency CreateInstance( IContext context )
        {
            return new Dependency( (int)context.ParentContext.Parameters.GetOne<ContextVariableParameter>( "masterVal" ).Value );
        }
    }

    public static void Main()
    {
        var module = new InlineModule(
            mod => mod.Bind<IDependency>().ToProvider( new DependencyProvider() )
        );

        var kernel = new StandardKernel( new[  ] {module} );

        Root root = kernel.Get<Root>( With.Parameters.ContextVariable( "masterVal", 12 ) ); 
    }

或者您可以按如下方式管理它:

    class RootProvider : SimpleProvider<Root>
    {
        protected override Root CreateInstance( IContext context )
        {
            return new Root( context.Kernel.Get<Dependency>( With.Parameters.ConstructorArgument("val", ( int )context.Parameters.GetOne<ContextVariableParameter>("masterVal").Value )));
        }
    }

    public static void Main()
    {
        var module = new InlineModule(
            mod => mod.Bind<IDependency>().To<Dependency>(), // Optional if ImplictSelfBinding is on
            mod => mod.Bind<Root>().ToProvider( new RootProvider() )
        );

        var kernel = new StandardKernel( new[] {module} );

        Root root = kernel.Get<Root>( With.Parameters.ContextVariable( "masterVal", 12 ) ); 
    }

当您考虑这一点时,请考虑我在这一点中提出的观点,即在此响应中将关注点与配置与对象绑定分开

于 2010-01-29T13:44:53.140 回答
2

使用 Ninject 3 IParameters(ConstructorArgument是其中之一)现在将简单地“继承”给子请求ShouldInherit == true(参见此处)。

这个问题的解决方案现在可以很简单:

IResolutionRoot.Get<Root>(new ConstructorArgument("val", 12, true));

其中s 构造函数true中的 设置为. 也见这里ConstructorArgumentShouldInherittrue

于 2015-09-23T14:45:02.590 回答