2009-10-29 29 views
8

Używam Dependency Injection w moim kodzie (z Ninject) i uważam, że robiłem całkiem dobrze, dopóki nie natknąłem się na problem z wydajnością, który został spowodowany przez nieporozumienie, gdzie pojemniki DI pasują do twojego kodu. Wydaje się, że jest wiele informacji o tym, jak używać frameworków DI, ale nie za bardzo, gdzie ich nie używać, ani jak najlepiej z nich korzystać (przynajmniej to, co mogłem znaleźć).Najlepsze praktyki wtrysku zależnego

Pomyślałem, że napiszę co ja uważam, że są pewne najlepsze praktyki i zobacz, czy inni ludzie zgadzają się ze mną i jakie inne najlepsze praktyki mogą wymyślić ludzie.

  • Użyj jednego jądro każdej aplikacji lub AppDomain
  • użyć kontenera DI dla długowiecznych Singleton tylko obiekty, fabryki Wykorzystywanie (lub innych metod) dla krótkotrwałych przemijających przedmiotów)
  • Wolę Konstruktor wtrysku w Nieruchomość lub wtrysk polowy
  • Zamów obiekty, nie buduj ich
  • inne? wskaźniki do dobrych blogów wprowadza/artykuły?
+0

co to jest jądro? czy to jest koncepcja specyficzna dla Ninject (nie widziałaś jej nigdzie indziej)? – zvolkov

+0

także zastrzyki settera kontra konstruktora są argumentem religijnym i jako takie należy ich unikać. – zvolkov

Odpowiedz

7

Oto krótka lista najważniejszych punktów (niektóre z nich pojawiają się także w PO):

  • Kodeks powinien być nieświadomi, które DI Container (jeśli w ogóle) jest używany
  • Compose cała aplikacja w katalogu głównym aplikacji (root Skład)
  • Favor Konstruktor wtryskowa

nie mogę powiedzieć, że zgadzam się z punktem o obiektach Singleton vs. Transient. Cały punkt DI jest taki, że zewnętrzny mechanizm (taki jak DI Container) określa czas życia dowolnej zależności, a nie kogoś innego, więc musisz mieć wszystkie zależności zarządzane przez DI Container.

+0

Witaj Mark, zobacz dyskusję tutaj (http://groups.google.com/group/ninject/browse_thread/thread/41ec03527da9f0f8) na temat wydajności programu Ninject w aplikacjach. Tak jak ty myślałem, że pojemnik DI powinien być używany wszędzie, ale narzut na pojemniki DI jest taki, że tworzenie dużej liczby obiektów przejściowych może być natarczywe. Twoja rada jest świetna dla aplikacji internetowych, ale nie tak bardzo w innych domenach. –

+0

Przesłuchałem tę dyskusję, ale myślę, że zgadzam się z Nate'em. DI powinien być używany do rozwiązywania i wstrzykiwania zależności, ale jeśli tworzy się setki tysięcy obiektów za pośrednictwem kontenera DI, coś jest nie tak z całym projektem. To nigdy nie było zamiarem DI. Mógłbym dodać do mojej listy kolejny punkt wypunktowania: "Zdolność oderwania niestabilności zależnych od trwałych zależności", ale jest to raczej ogólne zalecenie dotyczące projektu niż konkretny przedmiot DI. –

+2

Zgadzam się co do obiektów przejściowych - większość aplikacji używających DI tworzy dużą liczbę obiektów przejściowych. Niektóre pojemniki (Unity i wkrótce Autofac 2) są domyślnie przejściowe, a nie Singleton. Nie uważam, że "preferujemy singletony" może być postrzegana jako najlepsza praktyka - wydaje się bardziej jak komentarz do wykonania określonego kontenera w określonym scenariuszu. –

4

Użyj kontener DI dla długowiecznych Singleton tylko obiekty, fabryki Wykorzystywanie (lub innych metod) dla krótkotrwałych przemijających przedmiotów)

Ale używam DI wstrzyknąć fabryki w to, gdzie istnieje potrzeba .