Skip to content

Repository files navigation

AggregateKit

NuGetNuGet DownloadsBuildcodecovLicense: MITGitHub

AggregateKit is a lightweight library providing essential building blocks for Domain-Driven Design (DDD) in .NET applications.

Installation

dotnet add package AggregateKit

Features

  • Entity: Base class for domain entities with identity-based equality
  • AggregateRoot: Base class for aggregate roots with domain event handling
  • ValueObject: Base class for value objects with value-based equality
  • DomainEvents: Support for domain events through IDomainEvent and DomainEventBase
  • Result: Functional-style error handling with Result pattern
  • Guard: Utility methods for validating method arguments and enforcing invariants

Quick Start

Value Objects

publicclassMoney:ValueObject{publicdecimalAmount{get;}publicstringCurrency{get;}publicMoney(decimalamount,stringcurrency){Amount=amount;Currency=currency;}protectedoverrideIEnumerable<object?>GetEqualityComponents(){yieldreturnAmount;yieldreturnCurrency;}}// Value objects with the same values are equalvarmoney1=newMoney(100,"USD");varmoney2=newMoney(100,"USD");Console.WriteLine(money1==money2);// True

Entities

publicclassProduct:Entity<Guid>{publicstringName{get;privateset;}publicMoneyPrice{get;privateset;}publicProduct(Guidid,stringname,Moneyprice):base(id){Name=name;Price=price;}// Entity behavior methods go here}// Entities with the same ID are equal, even if other properties differvarid=Guid.NewGuid();varproduct1=newProduct(id,"Product 1",newMoney(100,"USD"));varproduct2=newProduct(id,"Updated Name",newMoney(110,"USD"));Console.WriteLine(product1==product2);// True

Aggregate Roots

publicclassArticleCreatedEvent:DomainEventBase{publicGuidArticleId{get;}publicstringTitle{get;}publicstringAuthorName{get;}publicArticleCreatedEvent(GuidarticleId,stringtitle,stringauthorName){ArticleId=articleId;Title=title;AuthorName=authorName;}}publicclassArticle:AggregateRoot<Guid>{publicstringTitle{get;privateset;}publicstringContent{get;privateset;}publicstringAuthorName{get;privateset;}publicboolIsPublished{get;privateset;}publicDateTime?PublishDate{get;privateset;}privateArticle(){}publicArticle(Guidid,stringtitle,stringcontent,stringauthorName):base(id){Title=title;Content=content;AuthorName=authorName;IsPublished=false;PublishDate=null;AddDomainEvent(newArticleCreatedEvent(id,title,authorName));}publicvoidPublish(){if(IsPublished)return;IsPublished=true;PublishDate=DateTime.UtcNow;AddDomainEvent(newArticlePublishedEvent(Id,PublishDate.Value));}}

Result Pattern

publicResult<Article>CreateArticle(stringtitle,stringcontent,stringauthorName){if(string.IsNullOrWhiteSpace(title))returnResult<Article>.Failure("Title cannot be empty");if(string.IsNullOrWhiteSpace(authorName))returnResult<Article>.Failure("Author name cannot be empty");vararticle=newArticle(Guid.NewGuid(),title,content,authorName);returnResult<Article>.Success(article);}// Usagevarresult=CreateArticle("Domain-Driven Design","DDD concepts explained...","Eric Evans");if(result.IsSuccess){vararticle=result.Value;// Process the article}else{// Handle errorsforeach(varerrorinresult.Errors){Console.WriteLine(error);}}

Development

This project includes Docker support and a Makefile for development workflows:

# Run tests
make test# Run tests in Docker
make docker-test
# Build the package
make pack

See DEVELOPMENT.md for complete development instructions.

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Lightweight building blocks for implementing Domain-Driven Design (DDD) in .NET applications. Includes base types for Entity, Value Object, Aggregate Root, and Domain Events.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages