2012-01-03 10 views
6

Mam następujący kodJak używać Provider w Ninject

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 
    } 
} 

ale wydaje Operator bierze Ikona i tekst gdzie położyłem xxxxxx. Powinny nie używać IContext od kiedy bootstrapped i utworzony Something.cs z jądra zostanie użyty. Gdzie nie ma parametru Utwórz metodę na dostawcy? (Pochodzę z punktu widzenia lądu Guice, gdzie byłby zakodowany jak powyżej).

, więc pytanie brzmi: jak to zrobić poprawnie?

dzięki, Dean

Odpowiedz

12

Wydaje próbujesz użyć dostawcę jako fabryka w kodzie.

Dostawca w kategoriach wyrachowania to fabryka, która jest przyznawana firmie Ninject w celu tworzenia specjalnie utworzonych obiektów. W związku z tym uzyskuje kontekst rozstrzygający, który można wykorzystać do tworzenia różnych instancji w zależności od miejsca, w które wtryska się instancja.

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

Co chcesz to fabryka w koder, który tworzy instancję WindowHandler. Dlatego też utworzyć interfejs do tworzenia instancji tak:

public interface IWindowHandlerFactory 
{ 
    WindowHandler Create(); 
} 

Bind<IWindowHandlerFactory>().ToFactory(); 

Alternatywnie można wstrzykiwać Func<WindowHandler> bez dodawania konfiguracji. Ale moim zdaniem jest to mniej znaczące.

UWAGA: Wszystko to wymaga zastosowania wersji Ninject.Extensions.Factory jako wersji wstępnej 3.0.0-rc2 z Nuget.

Zobacz także: http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-introduction/

+0

Func jest dokładnie tym, czego szukałem. Czy nie ma sposobu, aby to zrobić w wersji 2.0, której jesteśmy wersją? –

+1

Zobacz http://stackoverflow.com/questions/4840157/does-ninject-support-func-auto-generated-factory/4851885#4851885 –

1

dobrze, mój ostateczne rozwiązanie było oszukać w ninject 2,0 z następującym kodem ...

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

i na liście wiązań mam

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

i po tym po prostu uruchomię aplikację

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

i oczywiście fabryki są wstrzykiwane tam, gdzie ich potrzebuję w heirarchii tego MainForm.

więc ręcznie wstawiam jądro podczas uruchamiania, a następnie, kiedy ładuję aplikację, naturalnie te fabryki są polami w klasach z adnotacją [Ninject], dzięki czemu mogą tworzyć obiekty. nie najczystsze, póki nie otrzymamy wersji 3.0, ale działa (i nienawidzę dodatkowych klas fabrycznych, muszę napisać kod, ale no cóż).

Powiązane problemy