زمین X نسل جدیدی از فریمورک زمین است که با تمرکز بر سادگی، ماژولار بودن، بازاستفاده، توسعهپذیری و یکدستی معماری بازطراحی شده است.
این پروژه با هدف ارائه مجموعهای از BuildingBlockها، الگوهای کاربردی، یکپارچهسازیها، ساختارهای آماده و اپلیکیشنهای قابل اجرا برای ساخت سیستمهای مدرن بر پایه .NET طراحی شده است.
زمین X تلاش میکند بین سادگی در استفاده و قدرت در توسعهپذیری تعادل ایجاد کند تا توسعهدهنده بتواند بدون درگیر شدن با پیچیدگیهای تکراری، روی حل مسئله و ساخت محصول تمرکز کند.
زمین X با اهداف زیر طراحی شده است:
- کاهش پیچیدگیهای تکراری در توسعه نرمافزار
- ایجاد یک معماری یکدست، قابل فهم و قابل توسعه
- فراهم کردن امکان انتخاب و جایگزینی پیادهسازیها در مرزهای درست
- تسهیل توسعه سیستمهای ماژولار
- کاهش هزینه شروع پروژههای جدید
- استانداردسازی الگوهای رایج در پروژههای .NET
- ارائه capabilityهای reusable و production-ready
زمین X از پنج دسته اصلی تشکیل شده است:
اجزای مستقل، self-contained و قابل reuse که میتوانند بدون وابستگی به سایر بخشها استفاده شوند.
ویژگیهای BuildingBlockها:
- مستقل از context اپلیکیشن
- قابل publish بهصورت package
- قابل استفاده در پروژههای مختلف
- متمرکز روی یک concern مشخص
- قابل توسعه و جایگزینی در صورت نیاز
نکته مهم:
- وابستگی به تکنولوژی مانع BuildingBlock بودن نیست
- abstraction پیشفرض نیست
- معیار اصلی، استقلال مصرف و مرزبندی درست concern است
الگوهای سطح اپلیکیشن که معمولاً از چند BuildingBlock تشکیل شدهاند و یک رفتار تکرارشونده را استاندارد میکنند.
این بخش برای حل مسائل تکراری در سطح application طراحی میشود، نه برای تعریف primitiveهای فنی خام.
HandlerExecution یک الگوی reusable برای استانداردسازی اجرای handlerها است که روی BuildingBlockهای موجود سوار میشود و بدون افزودن abstraction غیرضروری، base classها و helperهای کاربردی برای command handlerها و query handlerها ارائه میدهد.
اجزایی که مسئول ارتباط با سیستمهای خارجی هستند، مانند:
- APIها
- سرویسهای third-party
- message brokerها
- storage providerها
- providerهای بیرونی که application برای کارکرد خود به آنها متکی است
ساختارهای آماده و opinionated برای شروع سریع پروژهها.
نمونههای این بخش:
- MonolithStructure
- ModularMonolith
- MicroserviceModule (در آینده)
Foundationها معمولاً از چند capability مختلف استفاده میکنند و یک نقطه شروع آماده برای ساخت application فراهم میکنند.
اپلیکیشنهای آماده، قابل اجرا و ارزشمند که با استفاده از زمین X ساخته میشوند.
این بخش جایی است که BuildingBlockها، Patternها، Foundationها و Integrationها در کنار هم به یک محصول واقعی تبدیل میشوند.
هر capability باید تا حد امکان self-contained باشد و در مرز concern خودش بماند.
abstraction زمانی ایجاد میشود که:
- چند پیادهسازی واقعی وجود داشته باشد
- یا نیاز واقعی به decoupling وجود داشته باشد
- یا application نباید به implementation خاصی گره بخورد
در غیر این صورت wrapper و abstraction اضافه تولید نمیشود.
APIها باید:
- قابل فهم باشند
- predictable باشند
- کمپیچیدگی باشند
- رفتارهای پنهان و surprising نداشته باشند
در صورت نیاز، امکان replace یا extend کردن behavior باید وجود داشته باشد، اما این توسعهپذیری نباید از ابتدا باعث over-engineering شود.
در زمین X مستندات بخشی از خود capability هستند، نه چیزی جدا از آن.
هر capability باید علاوه بر کد، توضیح معماری، مرز concern، مدل استفاده و تصمیمهای طراحی خود را نیز داشته باشد.
Capabilityهایی که concernهای عمومی و reusable را پوشش میدهند.
نمونهها:
- Object Mapper
- Serializer
- Translator
- Caching
- Pulse
این دسته معمولاً concernهایی را شامل میشود که در لایههای مختلف application قابل استفاده هستند و به context خاصی وابسته نیستند.
Capabilityهایی که مربوط به runtime composition، service registration و startup behavior هستند.
نمونههای فعلی:
Capability مربوط به DI در زمین X با تمرکز بر:
- حذف wiring دستی
- استانداردسازی registration
- assembly scanning
- سادهسازی startup
نکته مهم:
Axon abstraction جدید غیرضروری ایجاد نمیکند و روی IServiceCollection کار میکند.
Capability مربوط به OpenAPI و API documentation در زمین X.
مسئولیتهای Lumen:
- ثبت OpenAPI در ASP.NET Core
- expose کردن document endpoint
- مدیریت مسیر و naming document
- ترکیب UIهای مختلف برای نمایش API
- سادهسازی setup برای API documentation
ویژگیها:
-
استفاده از OpenAPI built-in در ASP.NET Core (.NET 10)
-
استفاده از Options pattern استاندارد
-
عدم استفاده از hackهایی مانند:
OptionsWrapperOptions.CreateReplace
-
طراحی minimal و قابل توسعه
-
امکان فعالسازی چند UI بهصورت همزمان
-
جداسازی روشن بین registration و runtime
UIهای پشتیبانیشده:
- Scalar
- Swagger UI
- ReDoc
نکته مهم:
UIها capability مستقل نیستند؛ آنها بخشی از Lumen و presentation layer آن هستند.
Capability مربوط به Logging در زمین X با تمرکز بر:
- setup و registration ساده Serilog
- استانداردسازی logging در سطح application
- فراهم کردن تجربه یکپارچه برای sinks، enrichers و contextual logging
ویژگیها:
-
استفاده از Serilog بهعنوان implementation اصلی
-
بدون abstraction اضافی
-
builder سبک برای configuration
-
پشتیبانی از:
- Console
- File
- Seq
-
پشتیبانی از:
- CorrelationId
- TraceId / SpanId
- Application metadata
-
پشتیبانی از contextual logging:
- UserId / UserName
- properties سفارشی
-
startup logging سادهشده
نکته مهم:
Logging در این فاز provider-based نیست و بهصورت setup-oriented و minimal طراحی شده است.
این خانواده primitiveهای پایه دامنه و اپلیکیشن را نگه میدارد.
نمونهها:
- Entity
- AggregateRoot
- ValueObject
- DomainEvent
- DomainException
- Result Pattern
- Application primitiveهای پایه
این بخش سنگبنای طراحی applicationها و capabilityهای دامنهمحور در زمین X است.
این خانواده capabilityهای مربوط به داده، persistence و رفتارهای تکرارشونده لایه data را نگه میدارد.
Axiom capability مربوط به لایه Data در زمین X است و یک foundation استاندارد برای abstraction و implementation دسترسی به داده ارائه میدهد.
Axiom با این اهداف طراحی شده است:
- جدا نگه داشتن application از implementationهای persistence
- پشتیبانی از read side و write side از ابتدا
- آماده بودن برای CQRS در صورت نیاز
- استانداردسازی paging و sorting
- ارائه implementation پایه برای EF Core
- پشتیبانی از providerهای مختلف
- ارائه audit پایه بهصورت reusable
1. Data.Abstractions
مدلها و قراردادهای مشترک:
IDataAuditContextDefaultDataAuditContextPagedQueryPagedQuery<TSearch>PagedResult<TData>
2. Data.Write.Abstractions
قراردادهای write side:
IWriteRepository<TAggregate, TId>IUnitOfWork
3. Data.Read.Abstractions
قراردادهای read side:
IReadRepository<TEntity, TId>
4. Data.EntityFrameworkCore
هسته مشترک EF Core:
- registration entry point
- builderهای پایه
- provider validation
- interceptor registration
- auditing infrastructure
- model configuration helperهای مشترک
5. Data.EntityFrameworkCore.Write
پیادهسازی write side روی EF Core:
EfUnitOfWork<TDbContext>EfWriteRepository<TEntity, TId, TDbContext>- graph loading hook با
CreateAggregateQuery() - write repository scanning
6. Data.EntityFrameworkCore.Read
پیادهسازی read side روی EF Core:
EfReadRepository<TEntity, TId, TDbContext>- paging helper
- sorting helper
- default sorting fallback
- read repository scanning
7. Providerها
در نسخه فعلی providerهای زیر ارائه شدهاند:
- SQL Server
- PostgreSQL
Axiom از ابتدا read و write را جدا میبیند تا:
- CQRS در صورت نیاز بهراحتی قابل استفاده باشد
- behaviorهای read و write روشن و مستقل بمانند
- registration و implementation هر سمت ساده و قابل فهم باشد
Axiom فقط در مرزهای لازم abstraction ارائه میدهد؛ یعنی جایی که application نباید به EF Core یا provider خاص وابسته شود.
Axiom برای query side یک مدل یکدست برای paging ارائه میدهد:
PagedQueryPagedQuery<TSearch>PagedResult<TData>
ویژگیهای این مدل:
- شماره صفحه و اندازه صفحه
- امکان کنترل
IncludeTotalCount - sorting با
SortByوSortDescending - fallback sorting در implementation
- helper مرکزی برای ساخت خروجی page شده
مدل فعلی audit:
CreatedAtCreatedByModifiedAtModifiedBy
ویژگیها:
- propertyها بهصورت shadow property تعریف میشوند
- مقداردهی از طریق
SaveChangesInterceptorانجام میشود - user/time از
IDataAuditContextگرفته میشود - وابستگی مستقیم به user management یا business concern وجود ندارد
نسخه فعلی Axiom شامل دو sample end-to-end است:
- SQL Server sample
- PostgreSQL sample
این sampleها برای validate کردن این flowها استفاده میشوند:
- registration کامل
- read/write DbContext
- repository scanning
- paging و sorting
- auditing
- provider behavior
این خانواده capabilityهای مربوط به هویت جاری کاربر، مرزهای identity-adjacent و concernهای reusable مرتبط با user context را نگه میدارد.
Persona capability مربوط به دسترسی استاندارد به اطلاعات کاربر جاری در زمین X است.
مسئولیتهای Persona:
- ارائه contract برای current user
- ارائه contract وبی برای current user
- خواندن claimها
- تشخیص
IsAuthenticated - دسترسی به
IpAddress - دسترسی به
UserAgent - ارائه registration ساده برای ASP.NET Core
مدل طراحی Persona:
- یک پروژه Abstractions
- یک پروژه AspNetCore
- یک Sample
- بدون provider model
- با Options pattern استاندارد
- با جداسازی روشن بین contract و implementation
نکته مهم:
Persona در نسخه فعلی یک capability برای Current User Access است، نه یک سیستم کامل برای authentication، authorization یا user lifecycle management.
ساختار فعلی ریپو بهصورت کلی به شکل زیر است:
src/
00.BuildingBlocks/
01.CrossCutting/
Caching/
Abstractions/
Inmemory/
Redis/
SqlServer/
ObjectMapper/
Abstractions/
AutoMapper/
Serializer/
Abstractions/
Microsoft/
Newtonsoft/
Translations/
Abstractions/
Parrot/
SqlServer/
02.RuntimeAndRegistration/
OpenApi/
Lumen/
Scalar/
Swagger/
Redoc/
Logging/
03.DomainAndApplicationPrimitives/
01.Domain/
Kernel.slnx
src/
ZaminX.BuildingBlocks.Domain/
tests/
ZaminX.BuildingBlocks.Domain.Tests/
04.DataAndPersistence/
Axiom/
Axiom.slnx
src/
ZaminX.BuildingBlocks.Data.Abstractions/
ZaminX.BuildingBlocks.Data.Write.Abstractions/
ZaminX.BuildingBlocks.Data.Read.Abstractions/
ZaminX.BuildingBlocks.Data.EntityFrameworkCore/
ZaminX.BuildingBlocks.Data.EntityFrameworkCore.Write/
ZaminX.BuildingBlocks.Data.EntityFrameworkCore.Read/
ZaminX.BuildingBlocks.Data.EntityFrameworkCore.SqlServer/
ZaminX.BuildingBlocks.Data.EntityFrameworkCore.PostgreSql/
tests/
ZaminX.BuildingBlocks.Data.Abstractions.Tests/
ZaminX.BuildingBlocks.Data.EntityFrameworkCore.Tests/
samples/
ZaminX.Samples.Data.SqlServer/
ZaminX.Samples.Data.PostgreSql/
06.IdentityAndUsers/
Persona/
Persona.slnx
src/
Abstractions/
ZaminX.BuildingBlocks.IdentityAndUsers.Persona.Abstractions/
AspNetCore/
ZaminX.BuildingBlocks.IdentityAndUsers.Persona.AspNetCore/
samples/
ZaminX.Samples.IdentityAndUsers.Persona.AspNetCore/
01.ApplicationPatterns/
HandlerExecution/
HandlerExecution.slnx
src/
ZaminX.ApplicationPatterns.HandlerExecution/
tests/
ZaminX.ApplicationPatterns.HandlerExecution.Tests/
تمام مستندات در مسیر زیر قرار دارند:
docs/
ساختار docs شامل این بخشها است:
- vision
- architecture
- modules
- decisions
- project-state
در زمین X، docs مرجع اصلی توضیح capabilityها، تصمیمهای طراحی و وضعیت پروژه هستند. README نقش نمای کلی و entry point را دارد، نه جایگزین کامل docs.
زمین X در حال حاضر در فاز:
- تثبیت معماری
- توسعه capabilityهای اصلی
- ایجاد consistency در design
- ساخت foundationهای reusable برای استفاده در پروژههای واقعی
تمرکز فعلی پروژه روی این موارد است:
- تثبیت CrossCutting capabilityها
- تکمیل و تثبیت Axon
- طراحی و تثبیت Lumen
- طراحی و تثبیت Logging
- تثبیت Domain primitives
- تثبیت capability داده (Axiom) شامل abstraction، implementation و providerها
- تعریف و توسعه ApplicationPatterns
- تکمیل مستندات و همراستاسازی آنها با کد
- تثبیت کامل taxonomy
- تکمیل BuildingBlockهای اصلی
- تثبیت و گسترش Data & Persistence (Axiom)
- توسعه Foundationهای اولیه
- توسعه Applicationهای اولیه
- publish اولیه capabilityها
- افزایش پوشش تست و بهبود developer experience
در فاز فعلی، تمرکز پروژه روی ساخت capabilityهای پایه است. بنابراین برخی concerns عمداً خارج از scope نگه داشته شدهاند یا هنوز در مرحله بعدی قرار دارند، مانند:
- outbox و integration persistence patternها
- soft delete عمومی
- multi-tenancy عمومی
- query DSL عمومی
- providerهای بیشتر برای Axiom
- advanced transaction orchestration
- applicationهای نهایی گسترده
زمین X قرار نیست صرفاً یک مجموعه helper و utility باشد. هدف آن ساخت یک ecosystem منسجم از capabilityهای reusable است که:
- معماری تمیز را بهصورت عملی enforce کند
- هزینه شروع پروژه را کاهش دهد
- تکرارهای رایج را حذف کند
- توسعه را سریعتر و قابل پیشبینیتر کند
- و در عین حال flexibility لازم برای توسعه سیستمهای واقعی را حفظ کند
MIT