I've been watching the NET ecosystem evolve since NET Core's 2016 release, and in 2020, the migration from NET Framework to NET Core is well underway but not complete for most enterprise organisations.
Today, NET developers navigate two platforms: NET Framework and NET Core. NET Framework is in maintenance mode, with 4.8 being the final version, while NET Core is actively developed, with 3.1 being the current LTS version.
New projects should start on NET Core 3.1, while existing NET Framework applications need a migration plan. However, for stable applications that aren't changing and don't require cross-platform deployment, the plan can be deferred.
One key consideration for migration is the trade-off between the cost of migration and the benefits of moving to NET Core. For example, I've seen teams spend around 2-3 months migrating a medium-sized application, with a team of 2-3 developers, resulting in a 30-40% reduction in memory usage and a 20-30% increase in throughput. This is a significant improvement, especially for applications with high traffic or large datasets.
Another important factor is the choice of tools and frameworks. For instance, Entity Framework Core is a popular choice for database access, but it requires careful planning to ensure that database queries are optimized for performance. I've seen teams use tools like EF Core's built-in query profiling and caching mechanisms, such as Redis or Memcached, to improve performance by 50-70%.
Microsoft has announced NET 5, which will converge NET Core and NET Framework into a single platform, set to be released in November 2020. The naming change signals the completion of this convergence, and for organisations planning NET Core migrations, migrating to NET Core 3.1 and then upgrading to NET 5 is the recommended path.
The upgrade from NET Core 3.1 to NET 5 is straightforward, making it a viable option for organisations looking to make the switch. This convergence is a significant step forward for the NET ecosystem. In my experience, the upgrade process typically takes around 1-2 weeks, depending on the complexity of the application and the number of dependencies that need to be updated.
ASP.NET Core has consistently demonstrated exceptional performance, often placing near the top of the TechEmpower web framework benchmarks. It's competitive with frameworks like Go, Rust, and C++, and the combination of Kestrel, the async pipeline, and regular improvements has made NET a genuine performance leader. For example, in the TechEmpower benchmarks, ASP.NET Core 3.1 has achieved throughput of over 1.3 million requests per second, making it one of the fastest frameworks available.
The 'but Java is fast enough' era is over for NET skeptics, as the platform has proven itself to be a high-performance option. This is especially significant for organisations that require high-throughput applications. In fact, I've seen teams use ASP.NET Core to build applications that handle over 10,000 concurrent connections, with response times of under 10ms.
NET Core also has a strong container story, with first-class Docker tooling. Visual Studio generates Dockerfiles, and the Microsoft Container Registry hosts official NET runtime images. The publish model produces output ready for containerisation, making it easy to deploy NET Core applications in containers. For instance, using Docker, teams can achieve deployment times of under 5 minutes, compared to traditional deployment methods which can take hours or even days.
NET Framework, on the other hand, has no comparable container story. While Windows containers are available, they have higher overhead and smaller ecosystem support compared to Linux containers for NET Core. This makes NET Core the better choice for organisations looking to adopt container-first development. In terms of numbers, I've seen teams reduce their deployment time by 90% and their infrastructure costs by 50% by switching to NET Core and containerisation.
NET Core's support for cloud-native development is also worth noting. With the rise of Kubernetes and cloud-native technologies, NET Core provides a natural fit for organisations looking to adopt these technologies. For example, using Kubernetes and NET Core, teams can achieve autoscaling, self-healing, and high availability, making it easier to build and deploy scalable applications.