2015-06-06 15 views
26

Jak obecnie brak jest dokumentacji na temat DI - Dependency Injection. Czy ktoś może mi pomóc zrozumieć następujące:Dlaczego ktoś miałby używać zewnętrznego kontenera DI na wbudowanym kontenerze podstawowym ASP.NET Core?

  1. Jaka jest różnica między tymi rejestracjami?

    public void ConfigureServices(IServiceCollection services) 
    { 
        services.AddTransient<IService, Service>(); 
        services.AddScoped<IService, Service>(); 
        services.AddSingleton<IService, Service>(); 
        services.AddInstance(service); 
    } 
    
  2. Jakie są plusy/minusy korzystania z wbudowanego DI w porównaniu z istniejącymi rozwiązaniami, takimi jak (NInject, Autofac, Mapa struktury)?
  3. Jakie są obecne ograniczenia domyślnego zastrzyku zależności (jeśli istnieją)?
+1

Czy istnieją implementacje oparte na Dotnetcore dla dowolnego ze standardowych kontenerów DI (np. –

+0

@AbhijeetPatel, większość (jeśli nie wszystkie) kontenery DI są kompatybilne z .NET Core i .NET Standard. – Steven

Odpowiedz

15

Tu jest wyjaśnione:

  • Transient - Nowa instancja jest tworzona za każdym razem
  • lunetą - Pojedyncza instancja jest tworzona wewnątrz bieżącego zakresu. Jest to odpowiednik Singleton w bieżącym zakresie.
  • Singleton - Utworzono pojedynczą instancję działającą jak pojedyncza instancja
  • Instancja - Określona instancja jest podawana przez cały czas. Jesteś odpowiedzialny za jego początkowego tworzenia

wersja Alpha miał tego ograniczenia:

  • Obsługuje tylko zastrzyk konstruktora
  • Może tylko rozwiązać typów z jednego i tylko jednego konstruktora publicznego
  • nie robi obsługa zaawansowanych funkcji (takich jak zakresy nici lub automatyczne wykrywanie)

Jeśli nie piszesz naprawdę skomplikowany domyślny pojemnik DI powinien być dla Ciebie wystarczający. W innych przypadkach możesz wypróbować biblioteki, o których już wspomniałeś, które mają zaawansowane funkcje.

Moja rada będzie zaczynać się od domyślnej i zmienić implementację , gdy (jeśli) uderzysz w coś, czego nie możesz z nią zrobić.

+1

Wersja alfa nie jest już aktualna. – NucS

33

Dla rozwoju produktu jakiejkolwiek znacznie wielkości aplikacji, który następuje Stałą zasady, wbudowany pojemnik DI vNext będzie bezużyteczne, ponieważ:

  • Nie ma pomóc w weryfikacji konfiguracji, co czyni go naprawdę trudne do zdiagnozowania problemy wynikające z typowych błędnych konfiguracji, takich jak Captive Dependencies. W rozsądnej wielkości aplikacji trudno jest samemu zauważyć te błędy.
  • Niemożliwe jest zastosowanie zagadnień przekrojowych przy użyciu przechwytujących lub decorators. To sprawia, że ​​utrzymanie rozsądnej wielkości aplikacji jest naprawdę drogie.
  • Mimo że obsługuje mapowanie otwartych abstrakcji generycznych do otwartych implementacji ogólnych, nie może pracować z typami ogólnymi z ograniczeniami typu.
  • Niemożliwe jest dokonywanie rejestracji warunkowych, w taki sposób, że rejestracja zostanie wprowadzona tylko do określonej grupy konsumentów.

Jeśli zaczniesz z nowym i prosty projekt, moja rada jest, aby zastosować Pure DI (czyli ręcznie przewodowy komponentów bez użycia pojemnika) i rozwiązać swoje typy, podłączając your custom IControllerActivator. Później, gdy funkcje takie jak rejestracja i dekoracja partii poprawią łatwość konserwacji twojego composition root, przełącz się do jednej z uznanych bibliotek DI, która pasuje do twoich wymagań.

+0

Nadal ważne z ASP.NET Core 2.0? – Legends

+1

@ Legends. Tak. Ta odpowiedź nadal obowiązuje w .NET Core 2.0. – Steven

6

Jaka jest różnica między tymi rejestracjami?

  • Transient - instancja za każdym razem są pobierane
  • z lunetą - wystąpienia raz na żądanie HTTP i będzie dostępna przez cały okres żądania HTTP
  • Singleton - instancja raz i będzie dostępna dla cały cykl życia aplikacji
  • instancji - odpowiednik Singleton wyjątkiem podać instancji obiektu zamiast ramach tworzenia instancji

Źródło: http://www.khalidabuhakmeh.com/asp-vnext-dependency-injection-lifecycles, http://dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-injection-in-6-steps/

5

Aby odpowiedzieć na pytanie pierwsze: wydaje się, że ASP.NET docs zostały zaktualizowane i teraz wyraźnie stwierdzić, jaki jest każdy rodzaj rejestracji:

usług ASP.NET może być skonfigurowany z następujące okresy:

przejściowe

przejściowe usługi lifetime są tworzone za każdym razem są one żądanie ed. Ta żywotność działa najlepiej w przypadku usług lekkich i bezpaństwowych.

lunetą

scoped usługi lifetime są tworzone raz na zamówienie.

Singleton

usługi Singleton lifetime są tworzone po raz pierwszy są one wniosek, a następnie każda kolejna prośba będzie korzystać z tego samego instancji. Jeśli twoja aplikacja wymaga pojedynczego zachowania, to kontener usługowy do zarządzania czasem życia usługi jest zalecany jako zamiast implementacji pojedynczego wzoru projektu i zarządzania czasem życia obiektu w klasie.

Instance [pre RTM tylko!]

Możesz dodać instancję bezpośrednio do pojemnika usług. Jeśli to zrobisz, to wystąpienie będzie używane dla wszystkich kolejnych żądań (ta technika stworzy instancję o pojedynczej pozycji).Jedną z kluczowych różnic między usługami wystąpień i usługami Singleton jest usługa instancji jest tworzona w ConfigureServices, natomiast usługa singleton jest ładowana w trybie leniwym przy pierwszym żądaniu.


Zaktualizowany w RTM

pamiętać, że w Asp.Net Core RTM docs instancji został usunięty. Instancja jest w zasadzie tym samym, co Singleton, ale mają różne semantyki inicjalizacji (Singleton był leniwy załadowany). Ale teraz nie ma AddInstance API, tylko AddSignleton, który może wziąć już utworzoną instancję.

Powiązane problemy