GaEpd.AppLibrary
3.3.0
Prefix Reserved
See the version list below for details.
dotnet add package GaEpd.AppLibrary --version 3.3.0
NuGet\Install-Package GaEpd.AppLibrary -Version 3.3.0
<PackageReference Include="GaEpd.AppLibrary" Version="3.3.0" />
paket add GaEpd.AppLibrary --version 3.3.0
#r "nuget: GaEpd.AppLibrary, 3.3.0"
// Install GaEpd.AppLibrary as a Cake Addin #addin nuget:?package=GaEpd.AppLibrary&version=3.3.0 // Install GaEpd.AppLibrary as a Cake Tool #tool nuget:?package=GaEpd.AppLibrary&version=3.3.0
Georgia EPD-IT App Library
This library was created by Georgia EPD-IT to provide common classes and tools for our web applications. (Much of this work was inspired by the ABP Framework.)
How to install
To install , search for "GaEpd.AppLibrary" in the NuGet package manager or run the following command:
dotnet add package GaEpd.AppLibrary
What's included
Guard clauses
Guard clauses simplify checking for invalid input parameters. (This might be moved to a separate package later or replaced with a third-party tool like ardalis/GuardClauses.)
Example usage:
public class SomeClass
{
private readonly string _name;
public SomeClass(string name)
{
_name = Guard.NotNullOrWhiteSpace(name);
}
}
Domain entities
The following interfaces and abstract implementations of domain entities are provided for domain driven design:
- The basic
IEntity<TKey>
interface defines a basic entity with a primary key of the given type. IAuditableEntitey<TUserKey>
adds creation/update properties and methods for basic data auditing.ISoftDelete<TUserKey>
adds properties for "soft deleting" an entity rather than actually deleting it.
There are also abstract classes based on the above that you can derive your domain entities from, including Entity<TKey>
, AuditableEntity<TKey, TUserKey>
, SoftDeleteEntity<TKey, TUserKey>
, and AuditableSoftDeleteEntity<TKey, TUserKey>
.
ValueObject
An abstract ValueObject record can help add value objects to your domain entities. A value object is a compound of properties, such as an address or date range, that are comparable based solely on their values rather than their references. The properties of a value object are typically stored with its parent class, not as a separate record with its own ID. Value objects should be treated as immutable. When deriving from ValueObject
, you will have to provide a GetEqualityComponents()
method to define which properties to use to determine equality.
Example usage:
[Owned]
public record Address : ValueObject
{
public string Street { get; init; } = string.Empty;
public string? Street2 { get; init; }
public string City { get; init; } = string.Empty;
public string State { get; init; } = string.Empty;
[DataType(DataType.PostalCode)]
public string PostalCode { get; init; } = string.Empty;
protected override IEnumerable<object> GetEqualityComponents()
{
yield return Street;
yield return Street2 ?? string.Empty;
yield return City;
yield return State;
yield return PostalCode;
}
}
Note: The [Owned]
attribute is an Entity Framework attribute defining this as a value object owned by the parent class. See Owned Entity Types for more info on how this is implemented in EF Core.
Repository interfaces
Common repository interfaces define basic entity CRUD operations. The IReadRepository<TEntity, in TKey>
interface defines get and search operations (including paginated search). The IWriteRepository<TEntity, in TKey>
interface defines insert, update, and delete operations. IRepository<TEntity, in TKey>
combines the read and write interfaces.
Note that these interfaces work directly with domain entities. Your application should define application/domain services that define how the application interacts with the entities & repositories through data transfer objects (DTOs).
Predicate builder
Code from C# in a Nutshell is included to enable creating filter expressions that can be combined. The library comes with the commonly used filters WithId(id)
for all entities and ExcludedDeleted()
for "soft delete" entities.
Example usage:
public static Expression<Func<MyEntity, bool>> IsActive(this Expression<Func<MyEntity, bool>> predicate) =>
predicate.And(e => e.IsActive);
public static Expression<Func<MyEntity, bool>> ActiveAndNotDeletedPredicate() =>
PredicateBuilder.True<MyEntity>().IsActive().ExcludeDeleted();
Pagination classes
IPaginatedRequest
and IPaginatedResult<T>
define how to request and receive paginated (and sorted) search results.
The System.Linq.Dynamic.Core package is included.
List Item record
A ListItem<TKey>
record type defines a key-value pair with fields for ID of type TKey
and string
Name. The ToSelectList()
extension method takes a ListItem
enumerable and returns an MVC SelectList
which can be used to create an HTML <select>
element.
Enum extensions
GetDisplayName()
and GetDescription()
return the DisplayAttribute.Name
and DescriptionAttribute
values of an enum, respectively.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | 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. |
-
net7.0
- System.Linq.Dynamic.Core (>= 1.3.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
5.3.1 | 451 | 9/11/2024 |
5.3.0 | 607 | 9/10/2024 |
5.2.1 | 1,142 | 4/30/2024 |
5.2.0 | 127 | 4/29/2024 |
5.1.0 | 1,032 | 1/3/2024 |
5.0.1 | 123 | 1/2/2024 |
5.0.0 | 137 | 1/2/2024 |
4.1.0 | 586 | 11/9/2023 |
4.0.0 | 213 | 10/25/2023 |
3.5.1 | 358 | 9/20/2023 |
3.5.0 | 166 | 9/19/2023 |
3.4.0 | 135 | 9/18/2023 |
3.3.0 | 345 | 8/11/2023 |
3.2.0 | 605 | 5/22/2023 |
3.1.0 | 420 | 4/25/2023 |
3.0.0 | 733 | 3/27/2023 |
2.0.0 | 295 | 3/7/2023 |
1.1.0 | 676 | 12/22/2022 |
1.0.1 | 432 | 10/14/2022 |
1.0.0 | 860 | 10/6/2022 |
0.4.0-beta | 222 | 9/29/2022 |
0.3.0-beta | 205 | 9/23/2022 |
v3.3.0
- Added a "ConcatWithSeparator" string extension.
- Added "PreviousPageNumber" and "NextPageNumber" properties to the IPaginatedResult interface.
- Made some possible performance improvements to the Enum extensions.
Breaking change: The Enum extensions no longer work with nullable Enum values.
v3.2.0
- Added a "SetNotDeleted" (undelete) method to the ISoftDelete interface.
v3.1.0
- Added a "SaveChanges" method to the write repository.
v3.0.0
- Upgraded the library to .NET 7.
v2.0.0
- Moved the write repository operations to a separate interface.
- Added "Exists" methods to the read repository interface.
- Renamed the user ID properties on auditable entities.
v1.1.0
- Added predicate builder and common entity filters.
- Added enum extensions.
- Added the System.Linq.Dynamic.Core package.
v1.0.1
- Added a Readme file to the package.
v1.0.0
- Initial release.