Skip to main content

.NET and C#

Backend services in C# and .NET — built by developers who have worked in a microservice platform with hundreds of projects behind a national loyalty and online grocery service.

Hand-drawn illustration for .NET and C#

Tools and frameworks we use

  • C#
  • .NET 8 and .NET 10
  • ASP.NET Core
  • Azure Functions (isolated worker and 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 and xUnit
  • NSubstitute
  • Testcontainers
  • WireMock.Net
  • k6
  • OpenAPI, Kiota, and NSwag

.NET development for services that must work every day

A good backend is noticed most when it goes unnoticed. Users should be able to sign in, add items to the cart, pick a delivery slot, and use their coupons without thinking about which services talk to each other behind the scenes. We have worked in a large C# and .NET microservice platform with hundreds of projects behind a national loyalty and online grocery service — members, cart, orders, delivery slots, coupons, and search.

We have also built smaller, focused tools. One example is a .NET 10 service that syncs store opening hours to Google Business Profile and Apple Maps, so customers see the right hours where they actually look.

Architecture choices in C# and ASP.NET Core projects

Some decisions we make early, because they are expensive to change later:

  • Isolated worker for Azure Functions. It is the model Microsoft recommends for new functions, and it gives the same .NET version, middleware, and dependency injection as the rest of the codebase.
  • Generated clients from OpenAPI. Kiota or NSwag produce typed clients, so a broken contract is caught at build time rather than in production.
  • Resilience at the boundaries. Polly policies and caching wrap calls to other systems instead of being scattered through the domain logic.
  • Real databases in tests. Testcontainers rather than in-memory databases, because SQL, transactions, and migrations should be tested the way they actually run.
  • Explicit migrations. DbUp when the team wants to own the SQL, Entity Framework Core migrations when the model is driven from code.

We are also wary of layers that do not pay for themselves. MediatR and custom abstractions can bring order to large codebases, but in a small service a straightforward ASP.NET Core endpoint is often easier to read and debug.

ASP.NET Core, Azure Functions, and .NET Aspire

Many .NET solutions combine APIs, background jobs, and event flows. We use ASP.NET Core and YARP for APIs and gateways, Azure Functions and Durable Functions for event-driven processes and long-running workflows, and .NET Aspire to make local development with several services simpler. Data lives in Azure SQL, Cosmos DB, or Elasticsearch depending on how it is used, and messages flow through Kafka where systems need to stay loosely coupled.

We also contribute to open source in C#, including a BTCPay Server plugin that lets merchants receive Lightning payments directly to a Bare Bitcoin account.

Typical engagements

New APIs and microservices

We design and build services in ASP.NET Core and Azure Functions with clear contracts, OpenAPI documentation, and tests from day one.

Modernisation to .NET 10

We upgrade codebases from older versions such as .NET Core 3.1 to .NET 10, step by step and without halting ongoing development.

Integrations and event flows

We connect systems with Kafka, queues, and external APIs, with retries, caching, and monitoring that cope with failures elsewhere.

Senior .NET capacity in your team

Experienced developers who contribute to existing teams with architecture, code review, testing, and operations.

Frequently asked questions

Can you help us upgrade to a newer .NET version?

Yes. We have modernised services from .NET Core 3.1 to .NET 10. We map dependencies and risks first, then upgrade in small steps that can go to production continuously.

Do you work with Azure Functions or ASP.NET Core?

Both. Azure Functions suits event-driven jobs and integrations well, while ASP.NET Core is often the right choice for APIs with steady traffic. We choose based on load, cost, and how the team operates the solution.

How do you test .NET services?

With unit tests in NUnit or xUnit, integration tests against real databases using Testcontainers, simulated external APIs with WireMock.Net, and load tests with k6.

Can you join a large existing codebase?

Yes. We have worked in a platform with hundreds of .NET projects and are used to learning established conventions before proposing changes.

How quickly can you start?

Get in touch with a short description of what you need, and we will respond with an assessment of scope and when we can contribute.

Need help with .NET and C#?

Tell us briefly about the product, the team, or the system. We will respond with a practical suggestion for the next step — a complete delivery, senior capacity in your team, or technical advice.

Your email address and message are used only to respond to your enquiry.

Location
Oslo, Norway