Net-Base Magazyn

07.06.2026

C# i Delphi we wspólnej architekturze: pragmatyczna integracja zamiast podejścia albo-albo

Wiele przedsiębiorstw utrzymuje ukształtowane historycznie Delphi-aplikacje desktopowe i równolegle buduje nowe usługi C# oraz portale. Artykuł pokazuje, jak C# i Delphi współpracują we wspólnej architekturze: przez wyraźne warstwy, stabilne interfejsy, wspólne...

07.06.2026

Od tematu magazynowego do praktyki projektowej

Pasujące strony usługowe i techniczne do artykułu

W wielu działach IT sytuacja wyjściowa wygląda podobnie: stabilna, procesowo powiązana Delphi-aplikacja desktopowa obsługuje krytyczne procesy, podczas gdy nowe wymagania kierują się w stronę Webu, portali, użytkowania mobilnego i integracji z usługami chmurowymi. Równocześnie C# jest w wielu firmach przyjętym standardem w obszarze usług, Web-API i integracji tożsamości. Kluczowe pytanie brzmi więc nie „Delphi czy C#?”, lecz: jak połączyć C# i Delphi w jednej architekturze, tak aby eksploatacja, utrzymanie, przechowywanie danych i bezpieczeństwo pozostały kontrolowalne.

Ten artykuł opisuje praktyczne zasady architektury, które sprawdzają się w środowiskach korporacyjnych, gdzie nie wszystko można lub należy budować od nowa. Skupienie leży na jasnym rozgraniczeniu odpowiedzialności między klientem desktopowym, usługami, danymi i interfejsami — oraz na tym, jak planować kroki modernizacyjne z niskim ryzykiem, bez narażania bieżących procesów.

Dlaczego mieszane stacki są w firmach normalne

Rozwijane przez lata rozwiązania cyfrowe rzadko powstają na zielonym polu. Aplikacje Delphi były często rozbudowywane przez wiele lat, blisko procesów biznesowych, z rozbudowaną logiką danych i głęboką wiedzą o przypadkach brzegowych. Równolegle pojawiły się nowe wymagania: portale samoobsługowe, zautomatyzowane wymiany danych, podłączenia DMS/CRM/ERP, obsługa wielu tenantów, zwiększona audytowalność czy Single Sign-on.

W tym kontekście C# często daje korzyści dla ekosystemów webowych i serwisowych: szerokie spektrum hostingu, ustandaryzowana middleware, dobra integracja z dostawcami tożsamości i ustalone wzorce dla Web-API. Delphi pozostaje z kolei silny tam, gdzie chodzi o wydajne Windows-desktopowe klienty, długoterminowo utrzymywane aplikacje VCL lub specyficzne klienty multiplatformowe (np. via FMX).

Dlatego mieszanka nie jest „przypadkiem szczególnym”, lecz realistyczną odpowiedzią na ochronę inwestycji i presję modernizacyjną. Decydujące jest, aby wspólna eksploatacja nie stała się permanentnym placem budowy.

Zasada architektoniczna: jasne warstwy zamiast granic językowych

Kiedy spotykają się dwa języki, istnieje pokusa, by rozdzielić je według technologii („Wszystko Delphi to legacy, wszystko C# to nowe”). Technicznie może to działać krótkoterminowo, ale prowadzi długofalowo do tarć: zdublowane reguły biznesowe, niejasne odpowiedzialności i trudne do odtworzenia błędy.

Zamiast tego sprawdza się fachowe warstwowanie, często realizowane jako Layer-3 architektura: prezentacja (UI), domena (logika biznesowa) i infrastruktura (dostęp do danych, systemy zewnętrzne). Chodzi mniej o model z podręcznika, a bardziej o konkretny efekt w praktyce: decyzje dotyczące danych, walidacji i workflow są podejmowane w jednym miejscu i udostępniane przez stabilne interfejsy.

W mieszanej architekturze oznacza to w praktyce, że Delphi nadal może dostarczać część UI (lub konkretne workflow), podczas gdy C# Services kapsułkują warstwę domenową — lub odwrotnie. Istotne jest, aby krawędź między warstwami była technicznie czysta i testowalna.

C# und Delphi in einer gemeinsamen Architektur: drei bewährte Integrationsmuster

Dla powiązania Delphi i C# nie ma „jednej” właściwej drogi. Dobre decyzje opierają się na eksploatacji, wymaganiach bezpieczeństwa, latencji, wolumenie danych i cyklach wydań. W praktyce wykształciły się trzy wzorce.

1) Orientacja usługowa przez HTTP/REST jako standardowe powiązanie

Dla eksploatacji i dalszego rozwoju najczęściej najbardziej odporne jest powiązanie przez REST-APIs (interfejsy oparte na HTTP). Klienci Delphi wywołują serwisy C# lub Delphi; portale C# korzystają z tych samych punktów końcowych. Ta dekompozycja ułatwia planowanie wydań: aktualizacja klienta nie jest niezbędna, jeśli API pozostaje wstecznie kompatybilne.

Istotna jest profesjonalna realizacja: Timeouty, Retries, idempotencja (powtarzalne żądania bez skutków ubocznych), jasne kody błędów oraz strategia wersjonowania. Dla administracji i eksploatacji ważne są też: ujednolicone logi, możliwe do prześledzenia Request-IDs oraz dobrze mierzalne czasy odpowiedzi.

2) Wspólna baza danych: tylko przy jasnych zasadach

Wspólny dostęp do bazy danych ze strony Delphi i C# kusi, bo na początku daje szybkie rezultaty. Jednak w dłuższej perspektywie jest ryzykowny, jeśli obie strony zapisują bezpośrednio do tego samego zbioru tabel. Powód: reguły biznesowe migrują do triggerów, procedur składowanych lub „gdzieś w kliencie”. To utrudnia analizę błędów i audyty.

Jeśli wspólna baza jest nieunikniona (np. w fazach przejściowych), pomagają jasne reguły:

  • Centralizować zapisy: jeden system pełni rolę „System of Record” dla określonych encji.
  • Definiować kontrakty: widoki lub API jako stabilna warstwa odczytu zamiast bezpośrednich odwołań do tabel.
  • Planować okna migracji: zmiany w bazie wdrażać zawsze w sposób wstecznie kompatybilny (np. nowe kolumny najpierw jako opcjonalne).

Technicznie baza danych staje się wtedy komponentem infrastruktury, a nie szyną integracyjną.

3) Messaging/Events dla procesów asynchronicznych

Dla odseparowanych przebiegów (np. importy, powiadomienia, przetwarzanie pośrednie, zadania interfejsów) sensowny jest model asynchroniczny: jeden system publikuje zdarzenia, inny je przetwarza. To redukuje bezpośrednie zależności i stabilizuje piki obciążenia.

Dla kierownictwa IT i administratorów istotne są: monitoring (długości kolejek), koncepcje Dead-Letter (wiadomości nieudane), zachowanie przy ponownym uruchomieniu oraz jasna fachowa idempotencja. Events nie zastępują rzetelnego prowadzenia danych podstawowych, ale są skutecznym narzędziem dla odpornych łańcuchów procesów.

Kontrakty danych i kompatybilność: niedocenione sedno

Niezależnie od wzorca integracji o stabilności decyduje jakość kontraktów danych. Kontrakt danych to wiążący opis pól, typów, obowiązkowości/opcjonalności oraz semantyki. W REST-APIs jest to zwykle JSON; ważniejsze jest nie „sam JSON”, lecz dyscyplina w zarządzaniu zmianami.

Sprawdzone zasady, które znacząco upraszczają eksploatację:

  • Rozszerzać zamiast łamać: dodawać nowe pola, a stare najpierw dalej dostarczać.
  • Dokumentować semantykę pól: nie tylko „string”, lecz np. data w formacie ISO, strefa czasowa, dopuszczalne stany.
  • Tolerować wartości enum: klienci muszą przeżyć nieznane wartości (Forward-Compatibility).
  • Świadomie stosować wersjonowanie API: nie każde wydanie potrzebuje nowej wersji; zmiany łamiące kompatybilność muszą być jednoznacznie odizolowane.

Te punkty są szczególnie ważne, gdy Delphi-klienci desktopowi nie mogą być aktualizowani tak często jak usługi webowe.

Uwierzytelnianie i autoryzacja: wspólny model zabezpieczeń

Mieszane architektury rzadko zawodzą z powodu „techniki”, częściej przez niespójny model bezpieczeństwa. Dla przedsiębiorstwa decydujące są pytania: kto może co? Jak to się weryfikuje? Jak to się audytuje? Wspólny model zapobiega podwójnemu zarządzaniu użytkownikami i sprzecznym rolom.

W praktyce prowadzi to do centralnej warstwy tożsamości: na przykład za pomocą SAML 2.0 (federowane Single Sign-on, często w środowisku Enterprise) lub OpenID Connect (oparte na OAuth2, często dla nowoczesnych Web-API). C#-Services można zazwyczaj bezpośrednio podłączyć do dostawcy tożsamości; Delphi-Clients mogą pobierać tokeny i dołączać je do wywołań API. Ważne, żeby aplikacje desktopowe nie miały „specjalnych uprawnień” poprzez bezpośredni dostęp do bazy danych.

Dla administratorów kluczowe:

  • Czasy życia tokenów i strategia odświeżania (aby aplikacje klienckie działały stabilnie, a jednocześnie były bezpieczne)
  • Uwierzytelnianie usługa‑do‑usługi dla komunikacji wewnętrznej (np. mTLS lub podpisane tokeny)
  • Zasada najmniejszych uprawnień (Least Privilege): nie nadawać ról i uprawnień zbyt szeroko
  • Logi audytu: protokołować działania istotne dla bezpieczeństwa w sposób umożliwiający ich późniejsze odtworzenie

Koncepcje operacyjne: Windows- und Linux-Services, IIS und Prozesse im Alltag

Architektura w przedsiębiorstwie jest „dobra” tylko wtedy, gdy jest operacyjna: aktualizacje da się zaplanować, błędy zlokalizować, obciążenie opanować. W mieszanych środowiskach najczęstsze warianty eksploatacji to:

  • Windows- und Linux-Services: odpowiednie dla zadań w tle, przebiegów integracyjnych, workerów; dobrze integrują się z klasycznymi modelami eksploatacji serwerów Windows.
  • Windows- und Linux-Services/Daemon: sensowne dla modeli eksploatacji opartych na kontenerach lub VM; często stabilne w pracy ciągłej, dobra automatyzacja przez systemd.
  • Microsoft IIS: sprawdzone hostowanie aplikacji webowych i scenariuszy reverse-proxy w środowiskach skoncentrowanych na Windows.

Ważne jest, aby komponenty Delphi i C# spełniały podobne standardy operacyjne: spójne Health-Endpoints (wskaźniki żywotności), zdefiniowane timeouty, ograniczone zużycie zasobów oraz jasny proces deploymentu i rollbacku. To redukuje „technologie‑specyficzne” wyjątki.

Logowanie, śledzenie i metryki: wspólny poziom obserwowalności

Szczególnie przy dwóch stosach technologicznych ciągłe łańcuchy diagnostyczne są kluczowe. Typowy problem: Delphi-Client zgłasza „błąd przy zapisie”, C#-Service ma timeout, baza danych zgłasza blokady – brak wspólnego kontekstu.

W praktyce sprawdzone są:

  • ID korelacji dla każdego żądania (Client → API → DB), aby logi można było połączyć.
  • Logowanie strukturalne (klucz/wartość zamiast czystych linii tekstu), żeby móc później filtrować.
  • Metryki dotyczące opóźnień, współczynników błędów, długości kolejek i wykorzystania zasobów.
  • Klasyfikacja błędów: błędy biznesowe (walidacja) oddzielone od błędów technicznych (timeout, sieć).

Te podstawy oszczędzają w praktyce więcej czasu niż każda dyskusja o „właściwym języku“.

Dostęp do danych i migracja: BDE-zastąpienie, FireDAC i nowoczesne bazy danych

W zasobach Delphi dostęp do danych odgrywa historycznie dużą rolę. Tam, gdzie wciąż stosuje się stare ścieżki dostępu jak Borland Database Engine (BDE), pojawia się dodatkowa presja: aktualizacje systemu operacyjnego, przejście na 64 bity, dostępność sterowników, wymagania bezpieczeństwa. BDE-Ablösung to wtedy nie tylko modernizacja, ale redukcja ryzyka.

Typowe jest przejście na BDE-Ablösung mit nativer Anbindung (nowoczesna warstwa dostępu do danych w Delphi), połączone z bazą danych, którą łatwo obsługiwać operacyjnie (np. PostgreSQL, SQL Server, MariaDB). Dla wspólnej architektury Delphi/C# ważne są dwa aspekty:

  • Granice transakcji: kto rozpoczyna/zatwierdza transakcje i jak regulowane są równoległe zapisy?
  • Strategia blokad i izolacji: aby workflowy desktopowe i serwisy nie blokowały się nawzajem.

W przypadku migracji sprawdza się planowanie etapowe: najpierw zmodernizować warstwę sterowników i dostępu, potem skonsolidować model danych, a następnie ustabilizować interfejsy integracyjne. Dzięki temu źródła błędów stają się izolowalne, a rollbacki realistyczne.

Zarządzanie wydaniami: różne cykle aktualizacji do pogodzenia

Powtarzającym się polem napięć jest częstotliwość aktualizacji: usługi webowe można wdrażać częściej, klienci desktopowi często rzadziej (okna wdrożeniowe, komunikacja z użytkownikami, pakietowanie). Wspólna architektura musi uwzględniać tę asymetrię.

Praktyczne konsekwencje:

  • Wsteczna zgodność API jest obowiązkiem, nie opcją.
  • Feature Flags (przełączniki funkcjonalne) pomagają kontrolować aktywację nowych funkcji po stronie serwera.
  • Migracje schematu muszą przebiegać etapami: najpierw rozszerzyć bazę danych, potem serwis z nich korzysta, a na końcu zaktualizować klienta.
  • Jasna polityka deprecacji: stare endpointy lub pola usuwać dopiero po zdefiniowanym czasie.

Szczególnie w środowiskach regulowanych ważne jest spisanie tych zasad jako wytycznych architektonicznych, aby decyzje nie były za każdym razem wymyślane od nowa na poziomie projektu.

Typowe pułapki i jak ich systematycznie unikać

Z punktu widzenia eksploatacji najczęstsze problemy w mieszanych środowiskach Delphi/C# są dobrze przewidywalne. Jeśli wcześnie się nimi zajmie, koszty długoterminowe znacząco spadają.

Pułapka 1: zduplikowana logika biznesowa

Gdy klient Delphi i serwis C# implementują te same reguły różnie, powstają „błędy widmowe”: proces działa w UI, ale zawodzi przy imporcie przez API. Środek zaradczy: centralizować reguły w warstwie domenowej (serwis) lub jednoznacznie przypisać je według odpowiedzialności biznesowej, łącznie z jednoznacznymi odpowiedziami walidacyjnymi.

Pułapka 2: obejścia w UI zamiast czystych interfejsów

„Szybko dopisać pole w bazie danych” wydaje się w pojedynczym przypadku niewinne, ale tworzy cieniowe interfejsy bez logowania, uwierzytelniania i wersjonowania. Lepiej: konsekwentnie korzystać z zdefiniowanych endpointów, nawet jeśli początkowo wymaga to większej dyscypliny.

Pułapka 3: niejasne odpowiedzialności w operacjach

Jeżeli nie jest jasne, który zespół jest odpowiedzialny za który serwis, które logi i jakie parametry operacyjne, poszukiwanie błędów kończy się w praktyce ping-pongiem. Pomocna jest mapa usług (jaki serwis, jakie zależności, jakie porty, jakie wewnętrzne SLA) oraz ujednolicone runbooki na typowe zakłócenia.

Pułapka 4: brak spójności zabezpieczeń

Portal z SSO, podczas gdy klient desktopowy używa lokalnych kont administratora, stanowi w wielu audytach problem. Wspólny model tożsamości i ról redukuje ryzyko i obciążenie wsparcia.

Pomoc decyzyjna: Co pozostaje w Delphi, co trafia do C#?

Sensowny podział zależy mniej od ideologii, a bardziej od bliskości procesów i wymagań eksploatacyjnych. Orientacyjnie z perspektywy architektury i operacji:

  • Delphi jest często dobrym wyborem dla: istniejących desktopowych klientów Windows (VCL), bardzo responsywnych przepływów UI, scenariuszy bliskich pracy offline oraz długoterminowej konserwacji ukształtowanych interfejsów.
  • C# jest często dobrym wyborem dla: centralnych REST-API, usług integracyjnych do ERP/DMS/CRM, komponentów związanych z tożsamością, portali i procesów backendowych o wysokiej częstotliwości zmian.
  • Świadoma decyzja: logika danych i walidacja nie powinny być „po stronie klienta”, jeśli istnieje kilka frontów (desktop, portal, zadania importu).

Ważne: celem nie jest „wszystko do C#”, lecz solidna architektura całościowa, w której kroki modernizacyjne są planowalne, a procesy przedsiębiorstwa działają stabilnie.

Ścieżka modernizacji: krok po kroku od aplikacji do systemu

W praktyce wspólna architektura często jest etapem przejściowym, ale długotrwałym. Realistyczna ścieżka modernizacji unika dużych projektów o wysokim ryzyku i stawia na mierzalne cele pośrednie:

  1. Stabilizować interfejsy: wprowadzić REST-API jako granicę funkcjonalną, nawet jeśli wewnętrznie nie wszystko jest jeszcze ‚ładne’.
  2. Unowocześnić dostęp do danych: BDE-Ablösung, sterowniki, obsługa 64‑bit, wyraźne transakcje.
  3. Centralizacja tożsamości: SSO i model ról dla wszystkich dróg dostępu.
  4. Ujednolicić eksploatację: logging/monitoring/health, przejrzyste procesy wdrożeń, odtwarzalne środowiska.
  5. Rozdzielić moduły funkcjonalne: zwłaszcza części o dużej dynamice zmian przenieść do serwisów, UI stopniowo uprościć.

Ta kolejność nie jest dogmatyczna, ale zwykle minimalizuje zależności: bez stabilnych interfejsów i koncepcji eksploatacji każda kolejna zmiana stanie się droższa.

Wniosek: integracja to zadanie architektoniczne, nie kwestia języka

Trwałe połączenie Delphi i C# nie powstaje dzięki „bibliotekom mostkowym”, lecz przez jasne granice funkcjonalne, czyste kontrakty danych oraz koncepcję eksploatacji, która poważnie traktuje monitoring, bezpieczeństwo i zarządzanie wydaniami. Jeśli C# i Delphi w ramach wspólnej architektury świadomie współdziałają według podziału odpowiedzialności, firmy zyskują przede wszystkim jedno: modernizację bez przerwania procesów. Delphi może nadal niezawodnie obsługiwać stabilne desktopowe przepływy robocze, podczas gdy usługi C# dostarczają integrację, Web-APIs i portale jako centralne funkcje platformy.

Jeśli chcą Państwo krokowo zmodernizować istniejący krajobraz Delphi lub poprawnie podłączyć usługi C#, przegląd architektury z uwzględnieniem interfejsów, danych, eksploatacji i bezpieczeństwa jest najszybszą drogą do wiarygodnych decyzji. Więcej na ten temat w bezpośredniej rozmowie:

W obszarze merytorycznym istotną rolę odgrywają także Delphi modernizacja oraz REST-API dla oprogramowania istniejącego, gdy integracje, przepływy danych i dalszy rozwój muszą współgrać.

Omów projekt lub przedsięwzięcie modernizacyjne z Net-Base.

Następny krok

Jeżeli temat stanie się rzeczywistym projektem, architektura, stan istniejący i eksploatacja powinny być rozpatrywane razem na wczesnym etapie.

Wspieramy nie tylko w pojedynczych zagadnieniach, lecz także wtedy, gdy z fragmentów kodu źródłowego, kwestii związanych z systemami legacy lub koncepcji portalu ma powstać solidny projekt dla przedsiębiorstwa.

  • Stan istniejący, obraz docelowy i ryzyka techniczne są oceniane łącznie.
  • REST, dostęp do danych, portale i Rollout nie będą przesuwane na później.
  • Wcześnie widzą Państwo, która droga jest ekonomicznie i operacyjnie wykonalna.

Udostępnij wpis

Udostępnij ten wpis bezpośrednio

LinkedIn, X, XING, Facebook, WhatsApp i e-mail są natychmiast dostępne. Dla Instagrama przygotowujemy bezpośrednio link i krótki tekst.

E-mail

Instagram otwiera się w nowej karcie. Link i krótki tekst są wcześniej kopiowane do schowka.