Ardalis.GuardClauses 4.5.0

dotnet add package Ardalis.GuardClauses --version 4.5.0
NuGet\Install-Package Ardalis.GuardClauses -Version 4.5.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Ardalis.GuardClauses" Version="4.5.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Ardalis.GuardClauses --version 4.5.0
#r "nuget: Ardalis.GuardClauses, 4.5.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Ardalis.GuardClauses as a Cake Addin
#addin nuget:?package=Ardalis.GuardClauses&version=4.5.0

// Install Ardalis.GuardClauses as a Cake Tool
#tool nuget:?package=Ardalis.GuardClauses&version=4.5.0

<h1 align=center> <img src="media/logotype 1024.svg" width=50%> </h1>

NuGetNuGet publish Ardalis.GuardClauses to nuget

<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

Ardalis.GuardClauses on YouTube

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

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 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 is compatible.  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. 
.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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

    • No dependencies.
  • .NETStandard 2.1

    • No dependencies.
  • net7.0

    • No dependencies.

NuGet packages (152)

Showing the top 5 NuGet packages that depend on Ardalis.GuardClauses:

Package Downloads
Een.Common

Nuget package for common helpers and enums

Serilog.UI

Package Description

Serilog.Ui.MsSqlServerProvider

Package Description

MooVC

A collection of functionalities common to many applications, gathered to support the rapid development of a wide variety of applications targeting multiple platforms.

NinjaTools.FluentMockServer

A C# Client for the MockServer Docker Image

GitHub repositories (17)

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
4.5.0 158,977 2/26/2024
4.4.0 265,502 1/23/2024
4.3.0 256,658 12/23/2023
4.2.0 385,821 11/9/2023
4.1.2 473 11/9/2023
4.1.1 813,812 8/1/2023
4.1.0 952 8/1/2023
4.0.1 6,844,523 3/28/2022
4.0.0 777,110 1/18/2022
3.3.0 1,133,284 10/29/2021
3.2.0 1,425,769 5/14/2021
3.1.0 559,545 2/13/2021
3.0.1 642,834 10/9/2020
3.0.0 198,404 8/20/2020
2.0.0 95,315 7/22/2020
1.5.0 919,510 4/29/2020
1.4.2 117,380 3/16/2020
1.4.1 93,223 2/13/2020
1.4.0 4,646 2/13/2020
1.3.3 67,197 1/18/2020
1.3.2 9,851 1/3/2020
1.3.1 69,547 11/15/2019
1.2.9 217,743 7/11/2019
1.2.8 93,342 2/11/2019
1.2.7 9,624 2/4/2019
1.2.6 3,053 1/24/2019
1.2.5 6,371 1/23/2019
1.2.4 474,312 11/26/2018
1.2.3 202,619 12/4/2017
1.2.2 2,743 12/1/2017
1.2.1 2,283 11/13/2017
1.2.0 1,930 11/13/2017
1.1.1 17,062 9/27/2017
1.1.0 1,557 9/26/2017
1.0.3 1,824 9/22/2017
1.0.2 1,920 9/22/2017
1.0.1 1,917 9/22/2017
1.0.0 23,076 9/12/2017

* Removed different method signatures for NETFRAMEWORK and NETSTANDARD2_0 by @Ergamon in #338
* Update for Guard Against StringLength by @rlarno in #343