9

tworzę nowy projekt w ASP.NET MVC przy użyciu 4.Najlepsze praktyki dla wstrzykiwania zależności

Chcę konfiguracji wstrzykiwania zależności używając Ninject. Ale zanim przejdę dalej, jakie są najlepsze praktyki podczas konfigurowania wtyczki zależności?

Obecnie mam konfigurację klasy wiążącej w ramach projektu webowego, która odwołuje się do projektów danych w ramach rozwiązania.

Klasa spoiwo, jak pokazano poniżej:

Public static class Binder 
{ 
    static Ninject.IKernel _kernel; 

    static Binder() 
    { 
     _kernel = new Ninject.StandardKernel(); 

     _kernel.Bind<IConfig>().To<AppSettingsConfig>(); 
     _kernel.Bind<IDocuments>().To<DocumentsClass.Documents>(); 

    } 

    public static T GetImplementation<T>() 
    { 
     return _kernel.Get<T>(); 
    } 

} 

Wtedy w moim kontrolera używam metody GetImplementation używać zależność dokładna wymagać zamiast rejestracji wszystkich przy starcie aplikacji.

Przykład kodu z kontrolerem:

Public ActionResult Get (int id) 
{ 
    var repository = Binder.GetImplementation<IDocuments>(); 

    // do some stuff with the repository here 
} 

Nie wiem, czy byłoby to dobre podejście? Każda rada byłaby dobra.

+4

Trochę kodu byłoby dobre, jak również? – BenjaminPaul

+1

@Wiktors odpowiedź poniżej jest drogą do zrobienia. Użyj wtrysku konstruktora tyle, ile możesz. Używaj tylko wzorca antysubskrypcyjnego SL, jeśli z jakiegoś powodu nie jesteś w stanie skonfigurować pełnego łańcucha zależności. –

Odpowiedz

16

To, co teraz masz, jest przykładem wzorca lokalizatora usług. Google po więcej szczegółów, ponieważ zostało to wielokrotnie omówione.

Krótko mówiąc, zamiast polegać na lokalizatora usług

public class SomeController 
{ 
    public ActionResult Get (int id) 
    { 
     var repository = Binder.GetImplementation<IDocuments>(); 

     // do some stuff with the repository here 
    } 
} 

powinieneś usługa wstrzykiwany do klasy klienta (polegać na wstrzyknięciu konstruktora)

public class SomeController 
{ 
    private IDocuments documentService { get; set; }  

    public SomeController(IDocuments documentService) 
    { 
    this.documentService = documentService; 
    } 

    public ActionResult Get (int id) 
    { 
     var repository = documentService; 

     // do some stuff with the repository here 
    } 
} 

w tym konkretnym przypadku, może skonfigurować fabrykę kontrolera, aby używał kontenera IoC do rozwiązywania kontrolerów.

0

Jesteś połączony z instancją klasy Binder wewnątrz kontrolera. To sprawia, że ​​twoja klasa nie nadaje się do ponownego użycia i musi zostać refaktoryzowana, ponieważ nie jest odpowiedzialnością kontrolera, aby uzyskać prawidłową implementację dokumentu IDocuments. Musi być jakiś zewnętrzny resolver zależności (np. - Ninject), który musi wykonać wtrysk konstruktora lub wtrysk własności.