AggregateKit is a lightweight library providing essential building blocks for Domain-Driven Design (DDD) in .NET applications.
dotnet add package AggregateKit- 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
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);// TruepublicclassProduct: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);// TruepublicclassArticleCreatedEvent: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));}}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);}}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 packSee DEVELOPMENT.md for complete development instructions.
This project is licensed under the MIT License - see the LICENSE file for details.