Ardalis.GuardClauses
5.0.0
dotnet add package Ardalis.GuardClauses --version 5.0.0
NuGet\Install-Package Ardalis.GuardClauses -Version 5.0.0
<PackageReference Include="Ardalis.GuardClauses" Version="5.0.0" />
paket add Ardalis.GuardClauses --version 5.0.0
#r "nuget: Ardalis.GuardClauses, 5.0.0"
// Install Ardalis.GuardClauses as a Cake Addin #addin nuget:?package=Ardalis.GuardClauses&version=5.0.0 // Install Ardalis.GuardClauses as a Cake Tool #tool nuget:?package=Ardalis.GuardClauses&version=5.0.0
<h1 align=center> <img src="media/logotype 1024.svg" width=50%> </h1>
<a href="https://twitter.com/intent/follow?screen_name=ardalis"> <img src="https://img.shields.io/twitter/follow/ardalis.svg?label=Follow%20@ardalis" alt="Follow @ardalis" /> </a> <a href="https://twitter.com/intent/follow?screen_name=nimblepros"> <img src="https://img.shields.io/twitter/follow/nimblepros.svg?label=Follow%20@nimblepros" alt="Follow @nimblepros" /> </a>
Guard Clauses
A simple extensible package with guard clause extensions.
A guard clause is a software pattern that simplifies complex functions by "failing fast", checking for invalid inputs up front and immediately failing if any are found.
Give a Star! ⭐
If you like or are using this project please give it a star. Thanks!
Usage
public void ProcessOrder(Order order)
{
Guard.Against.Null(order);
// process order here
}
// OR
public class Order
{
private string _name;
private int _quantity;
private long _max;
private decimal _unitPrice;
private DateTime _dateCreated;
public Order(string name, int quantity, long max, decimal unitPrice, DateTime dateCreated)
{
_name = Guard.Against.NullOrWhiteSpace(name);
_quantity = Guard.Against.NegativeOrZero(quantity);
_max = Guard.Against.Zero(max);
_unitPrice = Guard.Against.Negative(unitPrice);
_dateCreated = Guard.Against.OutOfSQLDateRange(dateCreated, dateCreated);
}
}
Supported Guard Clauses
- Guard.Against.Null (throws if input is null)
- Guard.Against.NullOrEmpty (throws if string, guid or array input is null or empty)
- Guard.Against.NullOrWhiteSpace (throws if string input is null, empty or whitespace)
- Guard.Against.OutOfRange (throws if integer/DateTime/enum input is outside a provided range)
- Guard.Against.EnumOutOfRange (throws if an enum value is outside a provided Enum range)
- Guard.Against.OutOfSQLDateRange (throws if DateTime input is outside the valid range of SQL Server DateTime values)
- Guard.Against.Zero (throws if number input is zero)
- Guard.Against.Expression (use any expression you define)
- Guard.Against.InvalidFormat (define allowed format with a regular expression or func)
- Guard.Against.NotFound (similar to Null but for use with an id/key lookup; throws a
NotFoundException
)
Extending with your own Guard Clauses
To extend your own guards, you can do the following:
// Using the same namespace will make sure your code picks up your
// extensions no matter where they are in your codebase.
namespace Ardalis.GuardClauses
{
public static class FooGuard
{
public static void Foo(this IGuardClause guardClause,
string input,
[CallerArgumentExpression("input")] string? parameterName = null)
{
if (input?.ToLower() == "foo")
throw new ArgumentException("Should not have been foo!", parameterName);
}
}
}
// Usage
public void SomeMethod(string something)
{
Guard.Against.Foo(something);
Guard.Against.Foo(something, nameof(something)); // optional - provide parameter name
}
YouTube Overview
Breaking Changes in v4
- OutOfRange for Enums now uses
EnumOutOfRange
- Custom error messages now work more consistently, which may break some unit tests
Nice Visualization of Refactoring to use Guard Clauses
https://user-images.githubusercontent.com/782127/234028498-96e206b0-9a70-4aa0-9c36-a62477ea0aa9.mp4
via Nicolas Carlo
References
- Getting Started with Guard Clauses
- How to write clean validation clauses in .NET (Nick Chapsas, YouTube, 9 minutes)
- Guard Clauses (podcast: 7 minutes)
- Guard Clause
Commercial Support
If you require commercial support to include this library in your applications, contact NimblePros
Build Notes (for maintainers)
- Remember to update the PackageVersion in the csproj file and then a build on main should automatically publish the new package to nuget.org.
- Add a release with form
1.3.2
to GitHub Releases in order for the package to actually be published to Nuget. Otherwise it will claim to have been successful but is lying to you.
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 is compatible. 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. |
.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 is compatible. |
.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. |
-
.NETStandard 2.0
- No dependencies.
-
.NETStandard 2.1
- No dependencies.
-
net8.0
- No dependencies.
NuGet packages (187)
Showing the top 5 NuGet packages that depend on Ardalis.GuardClauses:
Package | Downloads |
---|---|
Een.Common
Nuget package for common helpers and enums |
|
Serilog.UI
Simple web UI for several Serilog sinks. |
|
Ardalis.SharedKernel
An example shared kernel project/package for use with Ardalis.CleanArchitecture template. You should probably replace this with your own package! |
|
Serilog.UI.MsSqlServerProvider
Microsoft SQL Server data provider for Serilog UI. |
|
MooVC
A collection of functionalities common to many applications, gathered to support the rapid development of a wide variety of applications targeting multiple platforms. |
GitHub repositories (21)
Showing the top 5 popular GitHub repositories that depend on Ardalis.GuardClauses:
Repository | Stars |
---|---|
jasontaylordev/CleanArchitecture
Clean Architecture Solution Template for ASP.NET Core
|
|
ardalis/CleanArchitecture
Clean Architecture Solution Template: A starting point for Clean Architecture with ASP.NET Core
|
|
dotnet-architecture/eShopOnWeb
Sample ASP.NET Core 8.0 reference application, powered by Microsoft, demonstrating a layered application architecture with monolithic deployment model. Download the eBook PDF from docs folder.
|
|
rnwood/smtp4dev
smtp4dev - the fake smtp email server for development and testing
|
|
meysamhadeli/booking-microservices
Practical microservices, built with .Net 8, DDD, CQRS, Event Sourcing, Vertical Slice Architecture, Event-Driven Architecture, and the latest technologies.
|
Version | Downloads | Last updated |
---|---|---|
5.0.0 | 366,824 | 9/30/2024 |
4.6.0 | 977,740 | 7/8/2024 |
4.5.0 | 2,124,052 | 2/26/2024 |
4.4.0 | 599,884 | 1/23/2024 |
4.3.0 | 515,747 | 12/23/2023 |
4.2.0 | 728,499 | 11/9/2023 |
4.1.2 | 614 | 11/9/2023 |
4.1.1 | 1,199,036 | 8/1/2023 |
4.1.0 | 1,713 | 8/1/2023 |
4.0.1 | 9,161,190 | 3/28/2022 |
4.0.0 | 874,426 | 1/18/2022 |
3.3.0 | 1,263,149 | 10/29/2021 |
3.2.0 | 1,526,507 | 5/14/2021 |
3.1.0 | 596,928 | 2/13/2021 |
3.0.1 | 677,694 | 10/9/2020 |
3.0.0 | 205,384 | 8/20/2020 |
2.0.0 | 97,385 | 7/22/2020 |
1.5.0 | 1,034,364 | 4/29/2020 |
1.4.2 | 126,566 | 3/16/2020 |
1.4.1 | 98,809 | 2/13/2020 |
1.4.0 | 5,609 | 2/13/2020 |
1.3.3 | 72,765 | 1/18/2020 |
1.3.2 | 10,170 | 1/3/2020 |
1.3.1 | 71,896 | 11/15/2019 |
1.2.9 | 232,693 | 7/11/2019 |
1.2.8 | 94,965 | 2/11/2019 |
1.2.7 | 9,717 | 2/4/2019 |
1.2.6 | 3,356 | 1/24/2019 |
1.2.5 | 6,452 | 1/23/2019 |
1.2.4 | 490,926 | 11/26/2018 |
1.2.3 | 234,666 | 12/4/2017 |
1.2.2 | 2,851 | 12/1/2017 |
1.2.1 | 2,361 | 11/13/2017 |
1.2.0 | 2,012 | 11/13/2017 |
1.1.1 | 17,257 | 9/27/2017 |
1.1.0 | 1,640 | 9/26/2017 |
1.0.3 | 1,902 | 9/22/2017 |
1.0.2 | 1,993 | 9/22/2017 |
1.0.1 | 1,997 | 9/22/2017 |
1.0.0 | 36,150 | 9/12/2017 |
* Updating to 5.0 because 4.6 had breaking logic (see #354)
* Updated Obsolete message for Guard.Against.Expression to clarify reversal of logic (#457)