Введите значение во введенную зависимость

У меня есть что-то вроде этого:

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);

Я хотел бы ввести в Зависимость некоторое значение 'val', которое известно только во время получения Корневой ссылки от ninject.

То, что я хотел бы сделать, является чем-то вроде этого:

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

Что-то вроде этого - возможный ninject 1.0 использования?

8
задан cvbarros 21 February 2014 в 14:47
поделиться

1 ответ

Параметры . 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 ) ); 
    }

, пока вы думаете об этом, рассмотрим В этом пункте разделяют проблемы, если конфигурация от привязки объекта в этом ответе .

8
ответ дан 5 December 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: