8

私はこのようなものを持っています:

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

そして、ninject を使用してルートへの参照を取得しようとしています。だから私はこのように設定します

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

var kernel = new StandardKernel(module);

Dependency に、ninject からルート参照を取得する時点でのみ知られている「val」値を注入したいと思います。

私がやりたいことは次のようなものです:

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

ninject 1.0を使用してこのようなことは可能ですか?

4

2 に答える 2

8

コンテキスト内のParameters.ConstructorArgumentは、デフォルトで1レベルだけ深くなります。

パラメータを複数のレベルに渡す1つの方法は、ContextParameterを使用することですが、それを取得して言う必要があります。この場合は、これをConstructorArgumentとして使用します。そのような構成の1つがプロバイダーです。プロバイダーの詳細については、この道場のページを参照してください

だからあなたはすることができます:

    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 に答える