C#
C# and .NET are the foundation of enterprise software in Australian banking, insurance, and government. Modern .NET runs cross-platform with native AOT and minimal APIs.
Enterprise-grade, now cross-platform
C# is the language of enterprise software on the Microsoft stack, which in Australia means much of banking, insurance and government. It has evolved continuously for over two decades, and the platform beneath it was rebuilt entirely as open source in the .NET Core programme.
The language is built for large codebases held by large teams: strong typing with nullable reference types gives null safety at compile time, records make immutable domain models terse, and each release keeps older code compiling. C# 12 added primary constructors and collection expressions, and native AOT compiles a service to a self-contained binary for fast serverless cold starts.
One vendor stewards the whole platform, so the pieces are designed together: ASP.NET Core for web services, Entity Framework Core for data access, MAUI for cross-platform interfaces, and first-party SDKs for each Azure service. Upgrades arrive as one coordinated release rather than as an ecosystem negotiation.
C# is the wrong choice for exploratory data work and machine learning, which live in Python, and for small infrastructure tools, where Go's single static binaries are simpler to ship.
C# was used by 27.8% of respondents to the 2025 Stack Overflow Developer Survey.
.NET ships a major release each November, with every second release designated long-term support and maintained for three years.
- Enterprise APIs
- Azure Services
- Desktop Applications
- Financial Systems
Our C# capabilities
ASP.NET Core & minimal APIs
We build API services on ASP.NET Core, which consistently places among the fastest web frameworks in the TechEmpower benchmarks on its Kestrel server. Minimal APIs carry focused microservices where an endpoint is close to a single function and ceremony would outweigh the logic. Full controllers take the complex cases: rich model binding, filters and versioned public contracts. Both styles share the same middleware pipeline, authentication and telemetry, so the choice is made per service without splitting the platform.
- ASP.NET Core
- Minimal APIs
- Kestrel
Domain-driven design with .NET
Domains with real invariants get modelled explicitly: value objects as records, aggregates that guard their own state, and domain events dispatched through MediatR so side effects stay outside the core model. EF Core maps that model to the database without letting persistence shape it, and repositories appear only where the indirection earns its place. The approach suits audit-heavy financial systems, where CQRS and event sourcing with Marten or EventStoreDB give every state change a recorded cause.
- MediatR
- EF Core
- DDD
Azure-native cloud services
.NET and Azure are designed together, and we build with that grain: Azure Functions for event-driven work, Service Bus for durable messaging, Key Vault for secrets, and Container Apps where a service should simply run as a container. Aspire composes those dependencies locally, so an engineer runs the full distributed application on a laptop before any pipeline is involved. Infrastructure is defined in Bicep or Terraform and deployed through staged environments with integration test gates.
- Azure Functions
- Azure Service Bus
- Aspire
Why Adaca for C#?
Regulated .NET expertise
Core systems for regulated banks and insurers under change advisory boards and regulatory compliance requirements.
.NET Framework to .NET 8
Incremental migration from .NET Framework 4.x using the Upgrade Assistant and side-by-side deployment.
CQRS & event sourcing
CQRS with MediatR, event sourcing with Marten or EventStoreDB, suited to audit-heavy financial systems.
Azure DevOps & CI/CD
Azure Pipelines with staged deployments, integration test gates, and infrastructure-as-code with Bicep or Terraform.
Full-stack .NET teams
ASP.NET Core APIs, Blazor front-ends, Azure infrastructure, and SQL Server. One stack from database to UI.
Performance & diagnostics
Profiling with dotnet-trace, dotnet-counters, and BenchmarkDotNet to find allocation hotspots and GC pressure.
How We Staff It
Our .NET engineers come largely from regulated-industry work, banking and insurance in particular, where change advisory boards and audited release processes are the working norm. That background matters on the Microsoft stack, because the estates that run on it tend to sit close to core systems.
C# sits alongside Java at the enterprise end of our pool, and the two overlap: an engineer who has modernised one platform's legacy usually reads the other's fluently. Engineers work in your repositories and your pipelines, and to your working day.
Common Questions
Is .NET still tied to Windows?
No. The runtime has been open source and cross-platform since the .NET Core rebuild: services run in Linux containers as the ordinary case, Kestrel removed the dependency on IIS, and development happens on macOS and Linux as readily as on Windows.
The caveat is code still on .NET Framework 4.x, which remains Windows-only and receives fixes rather than new development. Moving it to modern .NET is a migration in its own right, and the Upgrade Assistant with side-by-side deployment makes it incremental rather than big-bang.
Does building in C# commit us to Azure?
No. .NET runs on any cloud or on premises, and AWS maintains first-party SDKs, Lambda runtimes and deployment tooling for it. The affinity with Azure is real, because the SDKs, the Aspire local orchestration and the deployment surface are designed alongside the platform, so friction is lowest there.
In practice the cloud decision follows the organisation's existing commitments, and the language ports to whichever answer that produces.
What makes C# work well with AI coding tools?
Documentation density and a single API surface. Nearly the whole platform is specified to one standard in one place, that material is heavily represented in training corpora, and generated C# therefore tends to call real APIs with correct signatures. Ecosystems with many competing libraries give a model several plausible idioms per task; .NET usually has one documented way.
The compiler then closes the loop. Incorrect code fails to build within seconds, nullable reference types catch a class of errors before any test runs, and an agent learns it is wrong almost as soon as it is.
How do we keep AI-generated C# consistent with our house rules?
Make the rules executable. Roslyn analyzers and .editorconfig turn naming, style and architecture conventions into build-time diagnostics. A generated change that breaks them fails the build in the same loop that checks its types, and the agent corrects against that signal without a reviewer intervening.
Few ecosystems let a team promote its own conventions into the compiler's feedback loop with this little machinery, and the same rules govern code written by hand. Measured results from our AI-augmented delivery flow are on the Technology page.
What does a .NET team from Adaca look like?
Usually one to three engineers who are full-stack within the platform: ASP.NET Core services, EF Core over SQL Server, a Blazor or Angular front end, and Azure infrastructure written as code. The stack's coherence is what keeps the team small, since one senior .NET engineer can own a feature from schema to interface.
Engagements start at one engineer, on terms of three, six, nine or twelve months chosen up front.
How do you price .NET work?
Pricing follows the engagement shape: a team you direct is charged as a monthly rate per engineer, and a defined first outcome, such as moving an initial service from .NET Framework to modern .NET, can be a fixed cost. Both models are described on the People pages.