Stricture.Net
1.0.0
See the version list below for details.
dotnet add package Stricture.Net --version 1.0.0
NuGet\Install-Package Stricture.Net -Version 1.0.0
<PackageReference Include="Stricture.Net" Version="1.0.0" />
<PackageVersion Include="Stricture.Net" Version="1.0.0" />
<PackageReference Include="Stricture.Net" />
paket add Stricture.Net --version 1.0.0
#r "nuget: Stricture.Net, 1.0.0"
#:package Stricture.Net@1.0.0
#addin nuget:?package=Stricture.Net&version=1.0.0
#tool nuget:?package=Stricture.Net&version=1.0.0
Stricture.Net
Architectural rules for .NET that break the build.
Declare your conventions as assembly attributes; violations show up as live IDE squiggles and
dotnet builderrors. A standalone analyzer toolkit — not a client library for another service.
Install:
dotnet add package Stricture.Net
One <PackageReference Include="Stricture.Net" /> delivers both assets: the attribute library you
reference (lib/netstandard2.0/Stricture.Abstractions.dll) and the Roslyn analyzer that enforces it
(analyzers/dotnet/cs/Stricture.Engine.dll). The consumer writes using Stricture;.
Usage
// Architecture.cs in the consuming project
using Stricture;
[assembly: FolderStructure("Features", Pattern = "{feature}/{category}", Fallback = "Models")]
[assembly: FolderStructure("Platform", Pattern = "{area}/{category}", Fallback = "Internal")]
[assembly: TypeFolder("Enumerations", Kind = TypeShape.Enum)] // structural
[assembly: TypeFolder("Exceptions", DerivesFrom = typeof(System.Exception))]
[assembly: TypeFolder("Requests", EndsWith = "Request")] // convention
[assembly: TypeFolder("Requests", EndsWith = "Response")] // same folder → co-location is legal
[assembly: TypeFolder("Models", IsRecord = true)]
[assembly: OneTypePerFile]
[assembly: CoLocateBySuffix("Request", "Response")]
[assembly: DefaultVisibility(Visibility.Internal)]
[assembly: BanPackage("Moq", Message = "Use NSubstitute-free hand-written test doubles.")]
Adding a fact is one attribute instance (no code); adding a behavior is one small rule class in the engine. Rules are pure functions of a context object, so each is testable in isolation.
Severity
Every ARCHxxxx rule defaults to Warning so consumer builds stay green until you opt in. Escalate
any rule to a build error in .editorconfig:
[*.cs]
dotnet_diagnostic.ARCH1001.severity = error
Diagnostics
| ID | What it catches |
|---|---|
ARCH0001 |
Invalid or contradictory configuration |
ARCH0002 |
An internal rule error (isolated; never kills analysis) |
ARCH1001 |
A top-level type in the wrong category folder |
ARCH1002 |
A type whose path doesn't match its structure's pattern |
ARCH1003 |
A public/internal nested type that should be promoted to its own file |
ARCH1010 |
A concrete type named after its interface (Foo : IFoo) |
ARCH1020 |
A public type that should be internal by default |
ARCH2001 |
More than one top-level type per file |
ARCH2002 |
Co-located types that mix suffix groups or have mismatched stems |
ARCH3001 |
Usage of a banned type or namespace |
ARCH4001 |
A reference to a banned assembly (package) |
Scope
Per-assembly (single-compilation) rules only. Cross-assembly / whole-solution aggregation is out of scope for this version.
License
MIT — see LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
This package has no dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
1.0.0 — Initial release. Attribute-driven, per-assembly architectural rules (ARCH0001–ARCH4001): folder-structure layout (ARCH1001/1002), nested-type promotion (ARCH1003), interface-naming (ARCH1010), internal-by-default (ARCH1020), one-type-per-file and suffix co-location (ARCH2001/2002), and banned type/namespace/package usage (ARCH3001/4001), plus config validation (ARCH0001) and isolated rule-error reporting (ARCH0002). Ships the attribute library and the analyzer in a single package. All rules default to Warning; escalate to error per rule in .editorconfig.