TD.Shared.Contracts 1.0.43

Shared – Contracts

The Contracts layer provides common shared parts of TD domain. Should be reference cross all valid projects. Must be pure contract layer.

Contents

Split into folders by business logic, but can be shared across all projects.

  • DTOs (Try to use Immutable DTOs implemented with Records)
  • Enums
  • Interfaces

USAGE IMPLEMENTATION EXAMPLE FluentValidationFilter

  • In this package we have "IFluentValidate" interface, which is implemented by DTOs that need validation.

example implementation of FluentValidationFilter in WebApi project:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class FluentValidation : Attribute, IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        IServiceProvider serviceProvider = context.HttpContext.RequestServices;
        CancellationToken ct = context.HttpContext.RequestAborted;
        var allErrors = new Dictionary<string, List<string>>();

        IEnumerable<IFluentValidate> singleValidatableArgs = context.ActionArguments.Values.OfType<IFluentValidate>();
        IEnumerable<IFluentValidate> collectionValidatableArgs = context.ActionArguments.Values
            .OfType<IEnumerable>()
            .SelectMany(c => c.OfType<IFluentValidate>());

        List<IFluentValidate> validationArgs = singleValidatableArgs.Concat(collectionValidatableArgs).ToList();
        await ValidateArgumentsAsync(serviceProvider, allErrors, validationArgs, ct);

        if (allErrors.Count > 0)
        {
            List<ErrorDetail> errorDetails = allErrors.SelectMany(kv => kv.Value.Select(errorMessage =>
                new ErrorDetail
                {
                    ErrorCode = ErrorCode.InvalidParameterValues.GetCode(),
                    Message = errorMessage,
                    Field = kv.Key
                })).ToList();

            throw new BadRequestException("One or more validation errors occurred.", ErrorCode.InvalidParameterValues, errorDetails);
        }

        await next();
    }

    private static async Task ValidateArgumentsAsync(
        IServiceProvider serviceProvider,
        Dictionary<string, List<string>> allErrors,
        IEnumerable<IFluentValidate> singleValidatableArgs,
        CancellationToken ct)
    {
        foreach (IFluentValidate argument in singleValidatableArgs)
        {
            Dictionary<string, List<string>> errors = await ValidateItemAsync(argument, serviceProvider, ct);
            foreach (var (key, messages) in errors)
            {
                allErrors[key] = messages;
            }
        }
    }

    private static async Task<Dictionary<string, List<string>>> ValidateItemAsync(
        IFluentValidate item,
        IServiceProvider serviceProvider,
        CancellationToken ct)
    {
        var validatorType = typeof(IValidator<>).MakeGenericType(item.GetType());
        if (serviceProvider.GetService(validatorType) is not IValidator validator)
        {
            return [];
        }

        var validationContext = new ValidationContext<IFluentValidate>(item);

        var result = await validator.ValidateAsync(validationContext, ct);
        if (result.IsValid)
        {
            return [];
        }

        return result.Errors
            .GroupBy(e => e.PropertyName)
            .ToDictionary(
                g => g.Key,
                g => g.Select(e => e.ErrorMessage).ToList());
    }
}

Showing the top 20 packages that depend on TD.Shared.Contracts.

Packages Downloads
TD.UrbanMobility.Data
Package Description
190
TD.Timetable
Methods for loading timetables
107
TD.Timetable
Methods for loading timetables
46
TD.Timetable
Methods for loading timetables
41
TD.UrbanMobility.Data
Package Description
32
TD.Timetable
Methods for loading timetables
31
TD.Timetable
Methods for loading timetables
30
TD.Timetable
Methods for loading timetables
28
TD.UrbanMobility.Data
Package Description
27
TD.Timetable
Methods for loading timetables
27
TD.Timetable
Methods for loading timetables
25
TD.Timetable
Methods for loading timetables
24
TD.UrbanMobility.Data
Package Description
19
TD.UrbanMobility.Data
Package Description
18
TD.UrbanMobility.Data
Package Description
17
TD.Timetable
Methods for loading timetables
17
TD.UrbanMobility.Data
Package Description
15
TD.Timetable
Methods for loading timetables
15
TD.Timetable
Methods for loading timetables
14

.NET 10.0

Version Downloads Last updated
1.0.47 31 09/15/2026
1.0.46 22 09/10/2026
1.0.45 5 09/10/2026
1.0.44 79 09/02/2026
1.0.43 92 09/01/2026
1.0.42 5 08/27/2026
1.0.41 8 08/25/2026
1.0.40 2 08/24/2026
1.0.39 7 08/20/2026
1.0.38 10 08/06/2026
1.0.37.3 3 08/24/2026
1.0.37.2 4 08/17/2026
1.0.37.1 5 08/11/2026
1.0.37 19 07/22/2026
1.0.36 46 07/06/2026
1.0.35 10 07/03/2026
1.0.34 11 07/01/2026
1.0.33 15 07/01/2026
1.0.32 31 06/30/2026
1.0.30 14 06/25/2026
1.0.29 7 06/24/2026
1.0.28 11 06/24/2026
1.0.27 12 06/24/2026
1.0.26 10 06/22/2026
1.0.25 5 06/19/2026
1.0.24 20 06/17/2026
1.0.23 10 06/16/2026
1.0.22 15 06/09/2026
1.0.21 32 06/04/2026
1.0.20 67 05/29/2026
1.0.19 9 05/28/2026
1.0.18 10 05/26/2026
1.0.17 15 05/25/2026
1.0.16 43 05/18/2026
1.0.15 21 05/13/2026
1.0.14 23 05/11/2026
1.0.13 7 05/05/2026
1.0.12 22 04/29/2026
1.0.11 14 04/26/2026
1.0.10 167 04/26/2026
1.0.9 36 04/11/2026
1.0.8 37 04/06/2026
1.0.7 9 04/04/2026
1.0.6 8 04/04/2026
1.0.5 22 04/03/2026
1.0.4 8 03/27/2026
1.0.3 7 03/27/2026
1.0.2 10 03/24/2026
1.0.1 7 03/24/2026
1.0.0 7 03/24/2026