Wychodzę kończyna tutaj i zgaduję, że „szukasz technik zorientowanych obiektowo do wdrażania oprzyrządowania.
Przychodzą mi na myśl dwa bezpośrednie sposoby, najczęściej używane są pierwsze, które zgaduję:
-
Miej gdzieś globalny stos (singleton lub jaki masz), za pomocą którego każda wykonywana metoda natychmiast się dodaje. Efektywnie utrzymując globalny łańcuch wywołań. Nie możesz tylko nie wyskakiwać na koniec każdej metody, którą próbujesz instrumentować, typowe inne praktyki związane z instrumentacją to uruchomienie stopera na początku metody i zatrzymanie się na końcu, aby zapisać długość itp.
-
Miej framework typu DI, który jest routerem dla wszystkich wywołań metod, który może działać Bardziej przypomina przekazywanie wiadomości, a wewnątrz tego frameworka zapisałbyś na stosie każde wywołanie metody, które występuje podobnie jak powyżej, z wyjątkiem tego, że byłoby scentralizowane w tym jednym miejscu.
Nie mogę powiedzieć, że proponuję # 2 bez użycia jakiegoś frameworka AOP lub czegoś w tym rodzaju, ale w sumie utrzymywanie własnego śladu stosu na 100% wywołań metod jest w moich oczach ekstremalnym instrumentarium. Świetne do debugowania rzeczy i być może konieczne, jeśli nie pracujesz w języku refleksyjnym, ale byłbym pewien, że mógłbym łatwo wyłączyć coś takiego w produkcji i zrobić co w mojej mocy, aby nie przeszkadzać, dlatego nie podoba mi się # 2 powyżej.
Żadne z nich nie jest konieczne w języku refleksyjnym i dlatego nie powinno być implementowane w C # poza zilustrowaniem procesu krzyżowania granice. (ostrzeżenie: mogą być szybsze niż refleksja, jeśli zostaną wykonane prawidłowo, ale koszt utrzymania nadal sprawia, że nie są tego warte)
Komentarze
IMHO Powinieneś poważnie zadać sobie pytanie, dlaczego uważasz, że tego potrzebujesz.
Jeśli MethodFoo()
zachowuje się inaczej, jeśli jest wywoływany z zestawu A lub B, to wywołujący zestaw jest czymś w rodzaju ukrytego parametru wejściowego do MethodFoo()
i prawdopodobnie może stać się przyczyną nieoczekiwanego lub błędnego zachowania.Dlatego też, alternatywnie, wyraź ten parametr wejściowy: dodaj dodatkowy parametr do MethodFoo()
, który wskazuje kontekst lub wywołującego. Może to być enum
, parametr string
lub odniesienie do samego wywołującego zestawu, w zależności od zamierzonej zmiany zachowania MethodFoo()
.
Komentarze