Wpis z mikrobloga

Jak dodajecie serwisy w .NET web appkach do DC?

  • Scrutor 13.2% (7)
  • Wlasna implementacja uzywajac 'reflection' 20.8% (11)
  • Source Generator 1.9% (1)
  • Inne (napisz w komentarzu co) 15.1% (8)
  • Sprawdzam tylko lub nie wiem o co chodzi 49.1% (26)

Oddanych głosów: 53

  • 17
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

  • 0
@drajvver: Serio? Mając wielki projekt z setkami serwisów, i dziesiątkami ludzmi którzy przy tym pracują, przy każdym kolejnym stworzonym serwisie - każdy ma grzecznie iść i w tym konkretnym pliku dodac linijkę żeby zarejestrować?

nie lepiej nie wiem, dodac atrybut, czy konkretny namespace i napisać kilka linijek kodu po to zeby oszczedzic tego kazdemu w przyszlosci? Raczej pragmatyczna oszczędność czasu.
  • Odpowiedz
@Varin: podzial na moduły, gdzie każdy moduł ma swoją część do zarejestrowania? Po co tworzyć magię jak można mieć wszystko od razu przejrzyście pokazane.
  • Odpowiedz
@Varin Mi rmusi to być jedno miejsce, jeśli np zgrupujesz serwisy w moduł to rejestrujesz cały moduł i wszystkie jego serwisy. Szukasz użycia interfejsu i widzisz gdzie jest używany. Ja ogólnie nie lubię rzeczy które dzieją się same czyli mas klasę która nigdzie nie jest używana i jakiś kod jej szuka refleksja tworzy instancję i odpala. W ten sposób tylko standardowe rzeczy jak np kontrolery bo to na pewno każdy zna
  • Odpowiedz
@Varin: Serio. Pracowałem przy kodzie różnej wielkości, czy to w korpo, czy startupach, czy czymś "domowym" i praktycznie nikt nie korzystał z refleksji, albo udziwnień w stylu source generatorów do rejestracji DI.

Często potrzebujesz zarejestrować jeden serwis jako scoped, inny transient, a jeszcze inny jako singleton - wtedy też walczysz z generatorami, żeby po połączyć do kupy?

Jeszcze Scrutora ewentualnie jestem w stanie "zrozumieć", bo masz jakiś interfejs markujący i
  • Odpowiedz
Często potrzebujesz zarejestrować jeden serwis jako scoped, inny transient, a jeszcze inny jako singleton - wtedy też walczysz z generatorami, żeby po połączyć do kupy?


@drajvver: No a jak ( ͡º ͜ʖ͡º)
Wtedy dodajesz atrybut do serwisu i bangla, co bardziej hardkorowi wprowadzali do tego interfejsy i później miałeś ISingletonScope, ITransientScope itp. xD
  • Odpowiedz
@Varin: z palucha, ręcznie, najwyżej sobie je w moduły popakuję. Ile tam masz w tej webówce serwisów, żeby tak kombinować?
Zaletą jest to, że każdy.NET dev zna standardowego DI, a o tych cudach pierwszy raz słyszę i każdego trzeba pewnie uczyć od nowa. Zwłaszcza jakichś rozwiązań opartych na refleksji (prawie na pewno zrobisz to gorzej niż MS).
  • Odpowiedz
  • 0
Często potrzebujesz zarejestrować jeden serwis jako scoped, inny transient, a jeszcze inny jako singleton - wtedy też walczysz z generatorami, żeby po połączyć do kupy?


@drajvver: Custom attribute ktory wrzucam nad klasą jeśli ma być inny lifetime niż Scoped, i potem zwyczajny switch przy rejestracji zeby wybrac lifetime, wszystko inne idzie jako Scoped. Jaka walka z generatorami, 1 linijka kodu...

Ile tam masz w tej webówce serwisów, żeby tak kombinować?
  • Odpowiedz
@some_ONE: @Varin A jak dodajecie zewnętrzne rzeczy? np takie coś jak IMemoryCache? Albo jakieś zewnętrzne rzeczy? Jak je konfigurujecie przez te atrybuty?

Bo ja robie tak:

services.AddMemoryCache()
services.AddMyModule()
services.AddExternalModule(Configuration)
  • Odpowiedz
  • 0
Jeszcze Scrutora ewentualnie jestem w stanie "zrozumieć",


@drajvver: Scrutor to refleksja przeciez. Wlasnie ostatnio wymienialem kod jakiegos szalenca na kilka linijek Scrutora. rejestruje wszystkie nie abstracyjne, nie statyczne serwisy i "factory" z danej namespace, patrzy na atrybuty zeby zarejestrowac jako odpowiedni lifetime, sprawdza czy dany serwis ma interfejs czy nie i rejestruje albo jako interface albo jako self. Kilka linijek, i nikt nic nigdy nie musi dodawać do rejestracji recznie.

static void AddGownoZDupyServicesInternal(IServiceCollection
  • Odpowiedz
@Varin: Głównie podział na moduły i rejestracja w instalatorze modułu poszczególnych serwisów.
I tam gdzie ma to sens to przy użyciu refleksji na danej, konkretnej asemblce na podstawie wspólnego interfejsu.
  • Odpowiedz
@Varin: a o to chodziło. To tylko domyślny DI, z czego projekt podzielony na Class Library. Każda CL ma swój plik, a w niej metodę gdzie rejestrujesz serwisy i później w samej webappce ręcznie wywołujesz te metody rejestrujące dla każdego modułu.
Chociaż w tym miejscu można użyć refleksji, żeby powyciągać te metody i odpalić.

Ale ja nie jestem fanem podejścia o którym napisałeś. Im mniej abstrakcji tym lepiej. A czy
  • Odpowiedz
A jak dodajecie zewnętrzne rzeczy? np takie coś jak IMemoryCache? Albo jakieś zewnętrzne rzeczy? Jak je konfigurujecie przez te atrybuty?


Bo ja robie tak:


services.AddMemoryCache()

services.AddMyModule()
  • Odpowiedz