Hopp til hovedinnhold

.NET og C#

Backend-tjenester i C# og .NET — bygget av utviklere som har jobbet i en mikrotjenesteplattform med flere hundre prosjekter bak en nasjonal lojalitets- og netthandelsløsning.

Håndtegnet illustrasjon for .NET og C#

Verktøy og rammeverk vi bruker

  • C#
  • .NET 8 og .NET 10
  • ASP.NET Core
  • Azure Functions (isolated worker og Durable Functions)
  • .NET Aspire
  • YARP
  • Entity Framework Core
  • Dapper
  • DbUp
  • Polly
  • MediatR
  • FusionCache
  • Serilog
  • OpenTelemetry
  • Duende IdentityServer
  • Kafka (Confluent)
  • Elasticsearch
  • Redis
  • Azure SQL
  • Cosmos DB
  • NUnit og xUnit
  • NSubstitute
  • Testcontainers
  • WireMock.Net
  • k6
  • OpenAPI, Kiota og NSwag

.NET-utvikling for tjenester som må virke hver dag

En god backend merkes mest når den ikke merkes. Brukerne skal kunne logge inn, legge varer i handlekurven, velge leveringstidspunkt og bruke kupongene sine uten å tenke på hvilke tjenester som snakker sammen bak. Vi har jobbet i en stor mikrotjenesteplattform i C# og .NET med flere hundre prosjekter bak en nasjonal lojalitets- og netthandelsløsning — medlemmer, handlekurv, ordre, leveringsvinduer, kuponger og søk.

Vi har også bygget mindre, avgrensede verktøy. Ett eksempel er en tjeneste i .NET 10 som synkroniserer åpningstider for butikker til Google Business Profile og Apple Maps, slik at kundene ser riktige tider der de faktisk leter.

Arkitekturvalg i C#- og ASP.NET Core-prosjekter

Noen valg tar vi tidlig, fordi de er dyre å endre senere:

  • Isolated worker for Azure Functions. Det er modellen Microsoft anbefaler for nye funksjoner, og den gir samme .NET-versjon, middleware og dependency injection som resten av kodebasen.
  • Genererte klienter fra OpenAPI. Kiota eller NSwag gir typede klienter, slik at brudd i en kontrakt oppdages ved bygging og ikke i produksjon.
  • Robusthet ved grensene. Polly-policyer og caching legges rundt kall til andre systemer, ikke spredt utover domenelogikken.
  • Ekte databaser i testene. Testcontainers fremfor in-memory-databaser, fordi SQL, transaksjoner og migreringer skal testes slik de faktisk kjører.
  • Eksplisitte migreringer. DbUp når teamet vil eie SQL-en selv, Entity Framework Core-migreringer når modellen styres fra koden.

Vi er også forsiktige med lag som ikke betaler for seg. MediatR og egne abstraksjoner kan rydde i store kodebaser, men i en liten tjeneste er et rett frem ASP.NET Core-endepunkt ofte lettere å lese og feilsøke.

ASP.NET Core, Azure Functions og .NET Aspire

Mange .NET-løsninger består av en blanding av API-er, bakgrunnsjobber og hendelsesflyt. Vi bruker ASP.NET Core og YARP for API-er og gateways, Azure Functions og Durable Functions for hendelsesdrevne prosesser og langvarige arbeidsflyter, og .NET Aspire for å gjøre lokal utvikling med flere tjenester enklere. Data lagres i Azure SQL, Cosmos DB eller Elasticsearch ut fra hvordan de skal brukes, og meldinger flyter gjennom Kafka der systemene må være løst koblet.

Vi bidrar også i åpen kildekode i C#, blant annet med en plugin for BTCPay Server som lar butikker motta Lightning-betalinger direkte til en Bare Bitcoin-konto.

Typiske oppdrag

Nye API-er og mikrotjenester

Vi designer og bygger tjenester i ASP.NET Core og Azure Functions med tydelige kontrakter, OpenAPI-dokumentasjon og tester fra første dag.

Modernisering til .NET 10

Vi oppgraderer kodebaser fra eldre versjoner som .NET Core 3.1 til .NET 10, steg for steg og uten å stoppe videreutviklingen.

Integrasjoner og hendelsesflyt

Vi kobler systemer sammen med Kafka, køer og eksterne API-er, med retry, caching og overvåking som tåler feil i andre ledd.

Senior .NET-kapasitet i teamet

Erfarne utviklere som bidrar i eksisterende team med arkitektur, kodegjennomgang, testing og drift.

Vanlige spørsmål

Kan dere hjelpe oss å oppgradere til en nyere .NET-versjon?

Ja. Vi har modernisert tjenester fra .NET Core 3.1 til .NET 10. Vi kartlegger avhengigheter og risiko først, og oppgraderer i små steg som kan settes i produksjon fortløpende.

Jobber dere med Azure Functions eller ASP.NET Core?

Begge. Azure Functions passer godt for hendelsesdrevne jobber og integrasjoner, mens ASP.NET Core ofte er riktig for API-er med jevn trafikk. Vi velger ut fra belastning, kostnad og hvordan teamet drifter løsningen.

Hvordan tester dere .NET-tjenester?

Med enhetstester i NUnit eller xUnit, integrasjonstester mot ekte databaser med Testcontainers, simulerte eksterne API-er med WireMock.Net og lasttester med k6.

Kan dere gå inn i en stor eksisterende kodebase?

Ja. Vi har jobbet i en plattform med flere hundre .NET-prosjekter og er vant til å sette oss inn i etablerte konvensjoner før vi foreslår endringer.

Hvor raskt kan dere starte?

Ta kontakt med en kort beskrivelse av behovet, så svarer vi med en vurdering av omfang og når vi kan bidra.

Trenger dere hjelp med .NET og C#?

Fortell kort om produktet, teamet eller systemet. Vi svarer med et konkret forslag til neste steg — enten det er en hel leveranse, senior kapasitet i teamet eller tekniske råd.

E-postadressen og meldingen brukes bare til å svare på henvendelsen din.

Telefon
920 50 946
Sted
Oslo, Norge