Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
697d16b
Update to .NET 10 for category
KahaMason Jan 22, 2026
35768a7
Mass update for .NET 10 references
KahaMason Jan 22, 2026
e8e769c
Re-organize rule order for .NET migrations
KahaMason Jan 22, 2026
d6f62d4
Merge branch 'main' of https://github.com/SSWConsulting/SSW.Rules.Con…
KahaMason Jan 22, 2026
9aa77fc
Added a redirect for the old .NET 8 migrations link
KahaMason Jan 23, 2026
d274eb6
Merge branch 'KM/NET-10-Update' of https://github.com/KahaMason/SSW.R…
KahaMason Jan 23, 2026
2ff146f
Renamed json mappings too
KostaMadorsky Jan 23, 2026
5111575
Another json fix
KostaMadorsky Jan 23, 2026
244ebbe
Small json fix
KahaMason Jan 23, 2026
c4d3462
TinaCMS content update
KahaMason Jan 23, 2026
cbad043
Merge branch 'KM6/NET-10-Update' of https://github.com/SSWConsulting/…
KostaMadorsky Jan 23, 2026
2f839ef
update tina-lock.json
Aibono1225 Jan 23, 2026
b4014e3
pull from main
KahaMason Jan 26, 2026
a2743af
Merge branch 'main' of https://github.com/SSWConsulting/SSW.Rules.Con…
KahaMason Jan 26, 2026
9231ed9
Apply suggestion from @KostaMadorsky
KahaMason Jan 27, 2026
86cacaf
Add redirect
KahaMason Jan 27, 2026
3fe21f1
Update link
KahaMason Jan 27, 2026
4b56ba7
Update rules-to-categories and redirects
KahaMason Jan 27, 2026
abbf2ca
Add missing endIntro tags to rules
KahaMason Jan 27, 2026
354ce88
Merge branch 'main' of https://github.com/SSWConsulting/SSW.Rules.Con…
KahaMason Jan 27, 2026
7081391
Update public/uploads/rules/disagreeing-with-powerful-stakeholders/ru…
KahaMason Jan 27, 2026
d84612b
Small conversions
KostaMadorsky Jan 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion categories/software-engineering/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ title: Software Engineering
uri: software-engineering
index:
- category: categories/software-engineering/rules-to-better-net-projects.mdx
- category: categories/software-engineering/rules-to-better-net8-migrations.mdx
- category: categories/software-engineering/rules-to-better-net10-migrations.mdx
- category: categories/software-engineering/rules-to-better-architecture-and-code-review.mdx
- category: categories/software-engineering/rules-to-better-azure.mdx
- category: categories/software-engineering/rules-to-better-blazor.mdx
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
---
_template: category
type: category
title: Rules to Better .NET 8 Migrations
experts: https://www.ssw.com.au/people/?skill=.NET-8-Migration
consulting: https://www.ssw.com.au/consulting/net-8
title: Rules to Better .NET 10 Migrations
experts: https://www.ssw.com.au/people/?skill=.NET-10-Migration
consulting: https://www.ssw.com.au/consulting/net-upgrade
guid: 2614b3ba-6219-4b32-9cf7-2b833eec8bdf
uri: rules-to-better-net8-migrations
uri: rules-to-better-net10-migrations
redirects:
- rules-to-better-net8-migrations
index:
- rule: public/uploads/rules/why-upgrade-to-latest-dotnet/rule.mdx
- rule: public/uploads/rules/migration-plans/rule.mdx
- rule: public/uploads/rules/dotnet-modernization-tools/rule.mdx
- rule: public/uploads/rules/migrating-web-apps-to-dotnet/rule.mdx
- rule: public/uploads/rules/dotnet-upgrade-assistant/rule.mdx
- rule: public/uploads/rules/migrate-from-system-web-to-modern-alternatives/rule.mdx
- rule: public/uploads/rules/migrate-from-edmx-to-ef-core/rule.mdx
- rule: public/uploads/rules/migrate-global-asax-to-asp-net-core/rule.mdx
Expand All @@ -19,8 +21,8 @@ index:
- rule: public/uploads/rules/manage-compatibility-for-different-tfms/rule.mdx
- rule: public/uploads/rules/dotnet-upgrade-for-complex-projects/rule.mdx
- rule: public/uploads/rules/do-you-check-your-api-serialisation-format/rule.mdx
- rule: public/uploads/rules/migrating-frontend-to-net8/rule.mdx
- rule: public/uploads/rules/migrating-frontend-to-net10/rule.mdx
- rule: public/uploads/rules/use-banned-api-analyzers/rule.mdx
---

Ready to migrate to .NET 8? Check [SSW's .NET 8 Migration consulting page](https://ssw.com.au/consulting/net-8).
Ready to migrate to .NET 10? Check [SSW's .NET 10 Migration consulting page](https://www.ssw.com.au/consulting/net-upgrade).
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ index:
- rule: public/uploads/rules/do-your-windows-forms-have-border-protection/rule.mdx
---

Did you know that Windows Forms was recently updated with the release of .NET 8? See the changes on [Microsoft Learn](https://learn.microsoft.com/en-us/dotnet/core/compatibility/windows-forms/8.0/anchor-layout)!
Did you know that Windows Forms was recently updated with the release of .NET 10? See the changes on [Microsoft Learn](https://learn.microsoft.com/en-us/dotnet/desktop/winforms/whats-new/net100)!
2 changes: 1 addition & 1 deletion category-uri-title-map.json
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@
"rules-to-better-naming-conventions": "Rules to Better Naming Conventions",
"rules-to-better-net-core": "Rules to Better .NET Core",
"rules-to-better-net-projects": "Rules to Better .NET Projects",
"rules-to-better-net8-migrations": "Rules to Better .NET 8 Migrations",
"rules-to-better-net10-migrations": "Rules to Better .NET 10 Migrations",
"rules-to-better-nextjs": "Rules to Better Next.js",
"rules-to-better-nuget": "Rules to Better Nuget",
"rules-to-better-open-source-software": "Rules to Better Open Source Software",
Expand Down
2 changes: 1 addition & 1 deletion public/uploads/rules/code-against-interfaces/rule.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Always code against an interface rather than a concrete implementation. Use depe

By creating an interface for each service and programming against the interface, you can easily swap out the implementation of the service without changing the code that uses the service.

It is important to also control the scope of the injection. For example, in ASP.NET 8 application you have the option to register the concrete implementation in the DI container either as a singleton, scoped, or transient service. Each of them will have a different lifetime in the application and should be set as per the requirement.
It is important to also control the scope of the injection. For example, in ASP.NET 10 application you have the option to register the concrete implementation in the DI container either as a singleton, scoped, or transient service. Each of them will have a different lifetime in the application and should be set as per the requirement.

![](/uploads/rules/code-against-interfaces/Code against interfaces - bad.png)
**❌ Figure: Bad Example - Referencing the concrete EF context**
Expand Down
6 changes: 3 additions & 3 deletions public/uploads/rules/directory-build-props/rule.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ This can be used for:
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>

Expand All @@ -67,7 +67,7 @@ This can be used for:
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>

Expand Down Expand Up @@ -105,7 +105,7 @@ This can be used for:
```xml
<Project>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Disagreeing with powerful stakeholders can have a huge impact. It's always good
<youtubeEmbed url="https://youtu.be/FbtHJm8vFpE?si=GNBJdUdM3QNCpRmx&t=186" description={"Video: How to Disagree with Someone More Powerful (watch 3 min from 3:06 to 5:38)"} />


Imagine a scenario where you are a Developer on a team and you disagree with the Product Owner about the priority of your PBI - migrating from .NET 6 to .NET 8. The Product Owner is saying they don't want to do it, but you think it's important for this Sprint.
Imagine a scenario where you are a Developer on a team and you disagree with the Product Owner about the priority of your PBI - migrating from .NET 6 to .NET 10. The Product Owner is saying they don't want to do it, but you think it's important for this Sprint.

Let's see what tips and tricks can be applied to ensure a smooth discussion.

Expand All @@ -52,9 +52,9 @@ By repeating back your understanding of the issue, you can check that their view
<boxEmbed
style="greybox"
body={<>
**Developer**: I think you don't want to migrate from .NET 6 to .NET 8 because you want to finish adding single-sign on first. And you consider any security issues to be priority 1. Is that correct?
**Developer**: I think you don't want to migrate from .NET 6 to .NET 10 because you want to finish adding single-sign on first. And you consider any security issues to be priority 1. Is that correct?

**Product Owner**: Actually, the reason is because .NET 9 comes out in a few months and I want to wait for that version.
**Product Owner**: Actually, the reason is because .NET 11 comes out in a few months and I want to wait for that version.
</>}
figurePrefix="good"
figure="Good example - The Developer identified that the Product Owner had a different reason than they thought"
Expand Down Expand Up @@ -90,7 +90,7 @@ Determine an outcome you both want to see from the solution. That way the conver

**Product Owner**: Yes, absolutely!

**Developer**: Well, when I read the .NET 8 release notes I saw they have improved performance by 20%. That's why I want to upgrade now.
**Developer**: Well, when I read the .NET 10 release notes I saw they have improved performance by 20%. That's why I want to upgrade now.
</>}
figurePrefix="good"
figure="Good example - The Developer identified a pain point the Product Owner cares about, strengthens their argument"
Expand Down Expand Up @@ -118,9 +118,9 @@ If you caveat that you are just expressing your opinion, others will feel like y
<boxEmbed
style="greybox"
body={<>
**Product Owner**: I don't want to upgrade to .NET 8 this Sprint because I want to wait for .NET 9
**Product Owner**: I don't want to upgrade to .NET 10 this Sprint because I want to wait for .NET 11

**Developer**: No, we should upgrade to .NET 8 this Sprint because it will help fix users' performance issues.
**Developer**: No, we should upgrade to .NET 10 this Sprint because it will help fix users' performance issues.
</>}
figurePrefix="bad"
figure="Bad example - The Developer didn't express that it was their opinion"
Expand All @@ -133,7 +133,7 @@ If you caveat that you are just expressing your opinion, others will feel like y
body={<>
**Product Owner**: [See above]

**Developer**: In my opinion, it's better if we upgrade to .NET 8 this Sprint because it will help fix users' performance issues.
**Developer**: In my opinion, it's better if we upgrade to .NET 10 this Sprint because it will help fix users' performance issues.
</>}
figurePrefix="good"
figure="Good example - The Developer mentions that it is their opinion leaving the topic open for discussion"
Expand All @@ -148,7 +148,7 @@ Language that sounds accusatory or judgmental can evoke bad reactions and derail
<boxEmbed
style="greybox"
body={<>
**Developer**: It would be stupid if we didn't upgrade to .NET 8 this Sprint
**Developer**: It would be stupid if we didn't upgrade to .NET 10 this Sprint
</>}
figurePrefix="bad"
figure="Bad example - The Developer made their point and it sounds like a personal attack"
Expand All @@ -159,7 +159,7 @@ Language that sounds accusatory or judgmental can evoke bad reactions and derail
<boxEmbed
style="greybox"
body={<>
**Developer**: If we don't upgrade to .NET 8 this Sprint, our users are going to keep having the performance issues they have been complaining about.
**Developer**: If we don't upgrade to .NET 10 this Sprint, our users are going to keep having the performance issues they have been complaining about.
</>}
figurePrefix="good"
figure="Good example - The Developer identifies a pain point for the users, rather than making it emotion based"
Expand All @@ -174,7 +174,7 @@ Let them know it's their decision, but be clear that you disagree. Communicating
<boxEmbed
style="greybox"
body={<>
We should upgrade to .NET 8 this Sprint so that we can solve the performance problems users are experiencing.
We should upgrade to .NET 10 this Sprint so that we can solve the performance problems users are experiencing.
</>}
figurePrefix="bad"
figure="Bad example - Doesn't leave the power in the stakeholders hands."
Expand All @@ -185,7 +185,7 @@ Let them know it's their decision, but be clear that you disagree. Communicating
<boxEmbed
style="greybox"
body={<>
This call is yours, but my opinion is that we should upgrade to .NET 8 this Sprint so that we can solve the performance problems users are experiencing.
This call is yours, but my opinion is that we should upgrade to .NET 10 this Sprint so that we can solve the performance problems users are experiencing.
</>}
figurePrefix="good"
figure="Good example - Clearly expresses that the final decision is up to them"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ type: rule
uri: do-you-catch-exceptions-precisely
---

In a try-catch block, avoid catching generic [Exception](https://learn.microsoft.com/en-us/dotnet/api/system.exception?redirectedfrom=MSDN&view=net-8.0&WT.mc_id=DT-MVP-33518) types as this masks the underlying problem. Instead, target only the specific exceptions you can manage, which helps in accurately identifying and rectifying the error.
In a try-catch block, avoid catching generic [Exception](https://learn.microsoft.com/en-us/dotnet/api/system.exception?redirectedfrom=MSDN&view=net-10.0&WT.mc_id=DT-MVP-33518) types as this masks the underlying problem. Instead, target only the specific exceptions you can manage, which helps in accurately identifying and rectifying the error.

It is essential to foresee the exceptions that the code in the try block might raise. Catching these specific exceptions at the point of occurrence provides the most context for effectively addressing the issue.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ authors:
created: 2024-05-13 05:45:10.297000+00:00
guid: 5d3f3d8d-161f-4fdd-9721-e4e9f37de9ac
related:
- rule: public/uploads/rules/dotnet-upgrade-assistant/rule.mdx
- rule: public/uploads/rules/dotnet-modernization-tools/rule.mdx
- rule: public/uploads/rules/migrate-from-system-web-to-modern-alternatives/rule.mdx
- rule: public/uploads/rules/migration-plans/rule.mdx
- rule: public/uploads/rules/modernize-your-app/rule.mdx
Expand All @@ -14,7 +14,7 @@ seoDescription: Migrate to System.Text.Json for faster performance and lower mem
property name casing.
title: Do you check your API serialisation format?
categories:
- category: categories/software-engineering/rules-to-better-net8-migrations.mdx
- category: categories/software-engineering/rules-to-better-net10-migrations.mdx
type: rule
uri: do-you-check-your-api-serialisation-format
---
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ guid: 4481526b-a691-4570-87d3-a9d474ae0dfd
redirects:
- do-you-know-where-to-host-frontend
related:
- rule: public/uploads/rules/migrating-frontend-to-net8/rule.mdx
- rule: public/uploads/rules/migrating-frontend-to-net10/rule.mdx
seoDescription: Discover the best way to host your frontend application with ASP.NET
8, balancing scalability, flexibility, and ease of deployment.
10, balancing scalability, flexibility, and ease of deployment.
title: Do you know where to host your Frontend application?
categories:
- category: categories/software-engineering/rules-to-better-websites-deployment.mdx
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
---
type: rule
title: Do you know how to modernize your .NET applications?
uri: dotnet-upgrade-assistant
uri: dotnet-modernization-tools
redirects:
- dotnet-upgrade-assistant
categories:
- category: categories/software-engineering/rules-to-better-net8-migrations.mdx
- category: categories/software-engineering/rules-to-better-net10-migrations.mdx
authors:
- title: Tylah Kapa
url: 'https://www.ssw.com.au/people/tylah-kapa'
Expand All @@ -20,22 +22,22 @@ seoDescription: >-
created: 2022-11-11T00:00:00.000Z
createdBy: Kaha Mason
createdByEmail: [email protected]
lastUpdated: 2026-01-20T07:10:50.793Z
lastUpdated: 2026-01-23T06:17:42.027Z
lastUpdatedBy: Kaha Mason
lastUpdatedByEmail: [email protected]
---

With outdated NuGet packages, C# styling and architectures, keeping our .NET Framework applications up to date can be a pain. Especially when we want to make the leap from .NET Framework to .NET for that juicy performance and compatibility bump.

Luckily Microsoft provides excellent tooling for supporting your great leap into .NET.
Luckily Microsoft provides excellent tooling for supporting your great leap into the latest version of .NET.

<endIntro />

## .NET Modernization Tools

### GitHub Copilot Modernization Agent

[GitHub Copilot Modernization Agent](https://dotnet.microsoft.com/en-us/platform/modernize) is Microsoft's newest AI-powered agent for Visual Studio, that aims to assist developers in migrating projects to the latest versions of .NET.
[GitHub Copilot Modernization Agent](https://learn.microsoft.com/en-us/dotnet/core/porting/github-copilot-app-modernization/overview) is Microsoft's newest AI-powered agent for Visual Studio, that aims to assist developers in migrating projects to the latest versions of .NET.

✅ **Pros**:

Expand Down Expand Up @@ -74,7 +76,7 @@ The [.NET Upgrade Assistant](https://learn.microsoft.com/en-us/dotnet/core/porti
* **Open source** - Contribute features and bug fixes to help others achieve the same goal
* **Upgrading to modern .NET** - Provides more opportunity for the future of your application

<imageEmbed alt="Image" size="large" showBorder={false} figurePrefix="none" figure="Use the CLI version of Upgrade Assistant" src="/uploads/rules/dotnet-upgrade-assistant/upgrade-assistant-CLI.png" />
<imageEmbed alt="Image" size="large" showBorder={false} figurePrefix="none" figure="Use the CLI version of Upgrade Assistant" src="/uploads/rules/dotnet-modernization-tools/upgrade-assistant-CLI.png" />

❌ **Cons**:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ authors:
created: 2023-07-16 23:08:53.979000+00:00
guid: 9de5ca88-a6aa-4fe5-af47-d6d2169cde86
related:
- rule: public/uploads/rules/dotnet-upgrade-assistant/rule.mdx
- rule: public/uploads/rules/dotnet-modernization-tools/rule.mdx
- rule: public/uploads/rules/migrate-from-system-web-to-modern-alternatives/rule.mdx
- rule: public/uploads/rules/do-you-check-your-api-serialisation-format/rule.mdx
seoDescription: Migrate legacy .NET Framework projects to modern ASP.NET Core with
Yarp proxy and .NET Upgrade Assistant.
title: Do you know how to handle complex .NET migrations?
categories:
- category: categories/software-engineering/rules-to-better-net8-migrations.mdx
- category: categories/software-engineering/rules-to-better-net10-migrations.mdx
type: rule
uri: dotnet-upgrade-for-complex-projects
---
Expand All @@ -33,7 +33,7 @@ There's not 1 single thing that makes a .NET project complex to migrate to the l
* Outdated NuGet packages with no modern alternatives
* etc.

If your project doesn't meet any of the above criteria, you should consider using the [.NET Upgrade Assistant](https://dotnet.microsoft.com/en-us/platform/upgrade-assistant). You can read more about the tool at [Do you know how to modernize your .NET applications?](/dotnet-upgrade-assistant/) If the .NET Upgrade Assistant works for your project, you could save a significant amount of time. However, the level of success may vary across different projects.
If your project doesn't meet any of the above criteria, you should consider using the [.NET Upgrade Assistant](https://dotnet.microsoft.com/en-us/platform/upgrade-assistant). You can read more about the tool at [Do you know how to modernize your .NET applications?](/dotnet-modernization-tools/) If the .NET Upgrade Assistant works for your project, you could save a significant amount of time. However, the level of success may vary across different projects.

While complex .NET migration has many steps and can be time-consuming, it offers significant benefits, including incremental migrations, improved risk management, and streamlined progress tracking.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ seoDescription: Learn how to migrate OWIN-based authentication to ASP.NET Core f
modern web applications.
title: Do you know how to migrate OWIN to ASP.NET Core?
categories:
- category: categories/software-engineering/rules-to-better-net8-migrations.mdx
- category: categories/software-engineering/rules-to-better-net10-migrations.mdx
type: rule
uri: know-how-to-migrate-owin-to-asp-net-core
---
Expand All @@ -21,6 +21,8 @@ The [Katana libraries](https://github.com/aspnet/AspNetKatana/) provided a flexi

Middleware and module registering functionality are now core features of ASP.NET Core. Microsoft provides adapters to and from the [OWIN interface for ASP.NET](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/owin?view=aspnetcore-7.0&WT.mc_id=DT-MVP-33518) that can be used to gradually migrate custom OWIN components. By contrast, ASP.NET Core has native ports for Katana components.

<endIntro />

## CORS functionality

CORS functionality was enabled in OWIN with the `UseCors(...)` extension method. For ASP.NET Core, it is provided by the [UseCors(...)](https://learn.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-9.0) extension method in the [`Microsoft.AspNet.Cors`](https://www.nuget.org/packages/Microsoft.AspNet.Cors) package.
Expand Down
Loading
Loading