Как использовать провайдера в Ninject - PullRequest
7 голосов
/ 03 января 2012

У меня есть следующий код

public class Something {
    [Inject]
    public Configuration config {get;set;} //singleton
    [Inject]
    public Provider<WindowHandler> windowsProvider { get; set; } //NOT singleton

    public void Search(string text) {
        WindowHandler handler = windowsProvider.Create(xxxxxx);
        //use the new handler that was created
    }
}

, но, кажется, провайдер берет IContext, где я поставил xxxxxxНе следует использовать IContext с момента загрузки и создания Something.cs из ядра.Где нет параметра Создать метод на Провайдере ???(Я исхожу из точки зрения Guice, где это будет закодировано, как указано выше).

поэтому вопрос в том, как мне сделать это правильно?

Ответы [ 2 ]

12 голосов
/ 04 января 2012

Кажется, вы пытаетесь использовать провайдера как фабрику в своем коде.

Поставщик в терминах Ninject - это фабрика, которая предоставляется Ninject для создания специально созданных объектов. Поэтому он получает разрешающий контекст, который можно использовать для создания разных экземпляров, в зависимости от того, куда экземпляр внедрен.

public class FooProvider : Provider<IFoo>
{
    public override IFoo CreateInstance(IContext ctx)
    {
        // add here your special IFoo creation code
        return new Foo();
    }
}

kernel.Bind<IFoo>().ToProvider<FooProvider>();

То, что вы хотите, это фабрика в вашем кодере, которая создает экземпляр WindowHandler. Поэтому создайте интерфейс для создания экземпляра следующим образом:

public interface IWindowHandlerFactory
{
    WindowHandler Create();
}

Bind<IWindowHandlerFactory>().ToFactory();

В качестве альтернативы вы можете ввести Func<WindowHandler> без добавления конфигурации. Но, на мой взгляд, это менее значимо.

ПРИМЕЧАНИЕ. Для всего этого требуется Ninject.Extensions.Factory, доступный в виде предварительной версии 3.0.0-rc2 от Nuget.

Смотри также: http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-introduction/

1 голос
/ 13 января 2012

Ну, мое окончательное решение было обмануть в ninject 2.0 с помощью следующего кода ...

        var windowFactory = kernel.Get<IEWindowFactory>();
        var tabFactory = kernel.Get<IETabFactory>();
        windowFactory.Kernel = kernel;
        tabFactory.Kernel = kernel;

и в списке привязок у меня есть

Bind<IEWindowFactory>().ToSelf().InSingletonScope();
Bind<IETabFactory>().ToSelf().InSingletonScope();

и после этого я просто запускаю приложение

var main = kernel.Get<MainForm>();
main.Start();

и, конечно, фабрики вводятся там, где они мне нужны, в наследии этой MainForm.

поэтому я вручную помещаю ядро ​​при запуске, а затем при начальной загрузке своего приложения, естественно, эти фабрики являются полями в классах с аннотацией [Ninject], и поэтому они могут создавать объекты. не самый чистый, пока мы не получим 3.0, но он работает (и я ненавижу дополнительные фабричные классы, для которых я должен писать код, ну да ладно).

...