@ngxtm/devkit 3.3.0 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/index.js +59 -13
- package/cli/rules.js +248 -0
- package/package.json +2 -1
- package/rules/README.md +141 -0
- package/rules/dart/best-practices/SKILL.md +23 -0
- package/rules/dart/language/SKILL.md +52 -0
- package/rules/dart/tooling/SKILL.md +43 -0
- package/rules/dotnet/aspnet-core/SKILL.md +92 -0
- package/rules/dotnet/aspnet-core/references/REFERENCE.md +335 -0
- package/rules/dotnet/best-practices/SKILL.md +101 -0
- package/rules/dotnet/best-practices/references/REFERENCE.md +256 -0
- package/rules/dotnet/blazor/SKILL.md +146 -0
- package/rules/dotnet/blazor/references/REFERENCE.md +392 -0
- package/rules/dotnet/language/SKILL.md +82 -0
- package/rules/dotnet/language/references/REFERENCE.md +222 -0
- package/rules/dotnet/patterns.rule.md +388 -0
- package/rules/dotnet/razor-pages/SKILL.md +124 -0
- package/rules/dotnet/razor-pages/references/REFERENCE.md +321 -0
- package/rules/dotnet/security/SKILL.md +89 -0
- package/rules/dotnet/security/references/REFERENCE.md +295 -0
- package/rules/dotnet/tooling/SKILL.md +92 -0
- package/rules/dotnet/tooling/references/REFERENCE.md +300 -0
- package/rules/flutter/auto-route-navigation/SKILL.md +43 -0
- package/rules/flutter/auto-route-navigation/references/REFERENCE.md +19 -0
- package/rules/flutter/auto-route-navigation/references/router-config.md +62 -0
- package/rules/flutter/bloc-state-management/SKILL.md +64 -0
- package/rules/flutter/bloc-state-management/references/REFERENCE.md +20 -0
- package/rules/flutter/bloc-state-management/references/auth-bloc-example.md +52 -0
- package/rules/flutter/bloc-state-management/references/equatable-usage.md +56 -0
- package/rules/flutter/bloc-state-management/references/property-based-state.md +68 -0
- package/rules/flutter/bloc.rule.md +76 -0
- package/rules/flutter/cicd/SKILL.md +48 -0
- package/rules/flutter/cicd/references/advanced-workflow.md +66 -0
- package/rules/flutter/cicd/references/fastlane.md +139 -0
- package/rules/flutter/cicd/references/github-actions.md +59 -0
- package/rules/flutter/dependency-injection/SKILL.md +42 -0
- package/rules/flutter/dependency-injection/references/REFERENCE.md +15 -0
- package/rules/flutter/dependency-injection/references/modules.md +37 -0
- package/rules/flutter/error-handling/SKILL.md +32 -0
- package/rules/flutter/error-handling/references/REFERENCE.md +19 -0
- package/rules/flutter/error-handling/references/error-mapping.md +31 -0
- package/rules/flutter/feature-based-clean-architecture/SKILL.md +46 -0
- package/rules/flutter/feature-based-clean-architecture/references/REFERENCE.md +14 -0
- package/rules/flutter/feature-based-clean-architecture/references/folder-structure.md +36 -0
- package/rules/flutter/getx-navigation/SKILL.md +70 -0
- package/rules/flutter/getx-navigation/references/app-pages.md +40 -0
- package/rules/flutter/getx-navigation/references/middleware-example.md +29 -0
- package/rules/flutter/getx-state-management/SKILL.md +76 -0
- package/rules/flutter/getx-state-management/references/binding-example.md +32 -0
- package/rules/flutter/getx-state-management/references/reactive-vs-simple.md +39 -0
- package/rules/flutter/go-router-navigation/SKILL.md +57 -0
- package/rules/flutter/idiomatic-flutter/SKILL.md +20 -0
- package/rules/flutter/layer-based-clean-architecture/SKILL.md +50 -0
- package/rules/flutter/layer-based-clean-architecture/references/REFERENCE.md +60 -0
- package/rules/flutter/layer-based-clean-architecture/references/repository-mapping.md +50 -0
- package/rules/flutter/localization/SKILL.md +50 -0
- package/rules/flutter/localization/references/REFERENCE.md +48 -0
- package/rules/flutter/localization/references/sheet-loader.md +33 -0
- package/rules/flutter/navigator-v1-navigation/SKILL.md +71 -0
- package/rules/flutter/navigator-v1-navigation/references/on-generate-route.md +48 -0
- package/rules/flutter/performance/SKILL.md +24 -0
- package/rules/flutter/retrofit-networking/SKILL.md +51 -0
- package/rules/flutter/retrofit-networking/references/REFERENCE.md +19 -0
- package/rules/flutter/retrofit-networking/references/token-refresh.md +40 -0
- package/rules/flutter/riverpod-state-management/SKILL.md +53 -0
- package/rules/flutter/riverpod-state-management/references/architecture.md +124 -0
- package/rules/flutter/riverpod-state-management/references/best-practices.md +89 -0
- package/rules/flutter/riverpod-state-management/references/testing.md +73 -0
- package/rules/flutter/riverpod.rule.md +78 -0
- package/rules/flutter/security/SKILL.md +33 -0
- package/rules/flutter/security/references/REFERENCE.md +15 -0
- package/rules/flutter/security/references/network-security.md +28 -0
- package/rules/flutter/testing/SKILL.md +44 -0
- package/rules/flutter/testing/references/REFERENCE.md +21 -0
- package/rules/flutter/testing/references/bloc-testing.md +38 -0
- package/rules/flutter/testing/references/integration-testing.md +128 -0
- package/rules/flutter/testing/references/robot-pattern.md +82 -0
- package/rules/flutter/testing/references/unit-testing.md +130 -0
- package/rules/flutter/testing/references/widget-testing.md +120 -0
- package/rules/flutter/widgets/SKILL.md +37 -0
- package/rules/golang/chi-router/SKILL.md +219 -0
- package/rules/golang/chi-router/references/REFERENCE.md +13 -0
- package/rules/golang/chi-router/references/routing-patterns.md +205 -0
- package/rules/golang/cobra-cli/SKILL.md +227 -0
- package/rules/golang/cobra-cli/references/REFERENCE.md +13 -0
- package/rules/golang/cobra-cli/references/command-patterns.md +224 -0
- package/rules/golang/core/SKILL.md +210 -0
- package/rules/golang/core/references/REFERENCE.md +14 -0
- package/rules/golang/core/references/concurrency-patterns.md +114 -0
- package/rules/golang/core/references/error-handling.md +87 -0
- package/rules/golang/echo-framework/SKILL.md +215 -0
- package/rules/golang/echo-framework/references/REFERENCE.md +14 -0
- package/rules/golang/echo-framework/references/middleware-patterns.md +141 -0
- package/rules/golang/echo-framework/references/routing-patterns.md +140 -0
- package/rules/golang/ent-orm/SKILL.md +239 -0
- package/rules/golang/ent-orm/references/REFERENCE.md +13 -0
- package/rules/golang/ent-orm/references/schema-patterns.md +255 -0
- package/rules/golang/fiber-framework/SKILL.md +196 -0
- package/rules/golang/fiber-framework/references/REFERENCE.md +13 -0
- package/rules/golang/fiber-framework/references/routing-patterns.md +191 -0
- package/rules/golang/gin-framework/SKILL.md +205 -0
- package/rules/golang/gin-framework/references/REFERENCE.md +14 -0
- package/rules/golang/gin-framework/references/middleware-patterns.md +119 -0
- package/rules/golang/gorm-orm/SKILL.md +196 -0
- package/rules/golang/gorm-orm/references/REFERENCE.md +14 -0
- package/rules/golang/gorm-orm/references/model-definitions.md +167 -0
- package/rules/golang/gorm-orm/references/query-patterns.md +161 -0
- package/rules/golang/grpc/SKILL.md +231 -0
- package/rules/golang/grpc/references/REFERENCE.md +13 -0
- package/rules/golang/grpc/references/service-patterns.md +276 -0
- package/rules/golang/testify/SKILL.md +239 -0
- package/rules/golang/testify/references/REFERENCE.md +13 -0
- package/rules/golang/testify/references/assert-patterns.md +170 -0
- package/rules/golang/validator/SKILL.md +234 -0
- package/rules/golang/validator/references/REFERENCE.md +13 -0
- package/rules/golang/validator/references/validation-tags.md +211 -0
- package/rules/golang/viper-config/SKILL.md +244 -0
- package/rules/golang/viper-config/references/REFERENCE.md +13 -0
- package/rules/golang/viper-config/references/config-loading.md +181 -0
- package/rules/golang/wire-di/SKILL.md +243 -0
- package/rules/golang/wire-di/references/REFERENCE.md +13 -0
- package/rules/golang/wire-di/references/provider-patterns.md +193 -0
- package/rules/golang/zap-logging/SKILL.md +203 -0
- package/rules/golang/zap-logging/references/REFERENCE.md +13 -0
- package/rules/golang/zap-logging/references/logger-config.md +165 -0
- package/rules/java/build-gradle/SKILL.md +92 -0
- package/rules/java/build-gradle/references/REFERENCE.md +14 -0
- package/rules/java/build-gradle/references/kotlin-dsl.md +118 -0
- package/rules/java/build-gradle/references/task-configuration.md +132 -0
- package/rules/java/build-maven/SKILL.md +86 -0
- package/rules/java/build-maven/references/REFERENCE.md +14 -0
- package/rules/java/build-maven/references/dependency-management.md +111 -0
- package/rules/java/build-maven/references/lifecycle-phases.md +114 -0
- package/rules/java/graalvm-native/SKILL.md +105 -0
- package/rules/java/graalvm-native/references/REFERENCE.md +12 -0
- package/rules/java/java-collections-streams/SKILL.md +148 -0
- package/rules/java/java-collections-streams/references/REFERENCE.md +15 -0
- package/rules/java/java-collections-streams/references/collectors-patterns.md +178 -0
- package/rules/java/java-collections-streams/references/stream-pipelines.md +165 -0
- package/rules/java/java-concurrency/SKILL.md +187 -0
- package/rules/java/java-concurrency/references/REFERENCE.md +17 -0
- package/rules/java/java-concurrency/references/completable-future.md +165 -0
- package/rules/java/java-concurrency/references/executor-patterns.md +176 -0
- package/rules/java/java-concurrency/references/virtual-threads.md +190 -0
- package/rules/java/java-core-language/SKILL.md +121 -0
- package/rules/java/java-core-language/references/REFERENCE.md +15 -0
- package/rules/java/java-core-language/references/jvm-memory-model.md +160 -0
- package/rules/java/java-core-language/references/modern-java-features.md +168 -0
- package/rules/java/java-project-structure/SKILL.md +195 -0
- package/rules/java/java-project-structure/references/REFERENCE.md +15 -0
- package/rules/java/java-project-structure/references/maven-project-layout.md +199 -0
- package/rules/java/java-project-structure/references/module-system.md +159 -0
- package/rules/java/micronaut-core/SKILL.md +99 -0
- package/rules/java/micronaut-core/references/REFERENCE.md +12 -0
- package/rules/java/micronaut-reactive/SKILL.md +68 -0
- package/rules/java/micronaut-reactive/references/REFERENCE.md +12 -0
- package/rules/java/quarkus-core/SKILL.md +85 -0
- package/rules/java/quarkus-core/references/REFERENCE.md +12 -0
- package/rules/java/quarkus-reactive/SKILL.md +67 -0
- package/rules/java/quarkus-reactive/references/REFERENCE.md +12 -0
- package/rules/java/spring-batch/SKILL.md +102 -0
- package/rules/java/spring-batch/references/REFERENCE.md +12 -0
- package/rules/java/spring-boot-architecture/SKILL.md +206 -0
- package/rules/java/spring-boot-architecture/references/REFERENCE.md +15 -0
- package/rules/java/spring-boot-architecture/references/auto-configuration.md +158 -0
- package/rules/java/spring-boot-architecture/references/configuration-properties.md +202 -0
- package/rules/java/spring-boot-web/SKILL.md +217 -0
- package/rules/java/spring-boot-web/references/REFERENCE.md +17 -0
- package/rules/java/spring-cloud/SKILL.md +109 -0
- package/rules/java/spring-cloud/references/REFERENCE.md +13 -0
- package/rules/java/spring-data-jpa/SKILL.md +241 -0
- package/rules/java/spring-data-jpa/references/REFERENCE.md +16 -0
- package/rules/java/spring-security/SKILL.md +161 -0
- package/rules/java/spring-security/references/REFERENCE.md +16 -0
- package/rules/java/spring-security/references/jwt-auth-flow.md +213 -0
- package/rules/java/testing-junit-mockito/SKILL.md +135 -0
- package/rules/java/testing-junit-mockito/references/REFERENCE.md +15 -0
- package/rules/java/testing-junit-mockito/references/junit5-patterns.md +159 -0
- package/rules/java/testing-junit-mockito/references/mockito-patterns.md +148 -0
- package/rules/java/testing-junit-mockito/references/spring-boot-testing.md +152 -0
- package/rules/javascript/best-practices/SKILL.md +64 -0
- package/rules/javascript/best-practices/references/REFERENCE.md +91 -0
- package/rules/javascript/language/SKILL.md +71 -0
- package/rules/javascript/language/references/REFERENCE.md +106 -0
- package/rules/javascript/tooling/SKILL.md +60 -0
- package/rules/javascript/tooling/references/REFERENCE.md +107 -0
- package/rules/metadata.json +54 -0
- package/rules/nestjs/api-standards/SKILL.md +47 -0
- package/rules/nestjs/api-standards/references/pagination-wrapper.md +87 -0
- package/rules/nestjs/architecture/SKILL.md +68 -0
- package/rules/nestjs/architecture/references/dynamic-module.md +53 -0
- package/rules/nestjs/caching/SKILL.md +51 -0
- package/rules/nestjs/caching/references/REFERENCE.md +13 -0
- package/rules/nestjs/caching/references/cache-patterns.md +183 -0
- package/rules/nestjs/configuration/SKILL.md +41 -0
- package/rules/nestjs/configuration/references/REFERENCE.md +13 -0
- package/rules/nestjs/configuration/references/config-patterns.md +184 -0
- package/rules/nestjs/controllers-services/SKILL.md +63 -0
- package/rules/nestjs/controllers-services/references/REFERENCE.md +14 -0
- package/rules/nestjs/controllers-services/references/controller-patterns.md +119 -0
- package/rules/nestjs/controllers-services/references/service-patterns.md +129 -0
- package/rules/nestjs/database/SKILL.md +102 -0
- package/rules/nestjs/database/references/REFERENCE.md +14 -0
- package/rules/nestjs/database/references/typeorm-patterns.md +156 -0
- package/rules/nestjs/deployment/SKILL.md +36 -0
- package/rules/nestjs/deployment/references/REFERENCE.md +13 -0
- package/rules/nestjs/deployment/references/deployment-patterns.md +140 -0
- package/rules/nestjs/documentation/SKILL.md +64 -0
- package/rules/nestjs/documentation/references/REFERENCE.md +13 -0
- package/rules/nestjs/documentation/references/swagger-patterns.md +139 -0
- package/rules/nestjs/error-handling/SKILL.md +55 -0
- package/rules/nestjs/error-handling/references/REFERENCE.md +13 -0
- package/rules/nestjs/error-handling/references/exception-filters.md +152 -0
- package/rules/nestjs/file-uploads/SKILL.md +35 -0
- package/rules/nestjs/file-uploads/references/REFERENCE.md +13 -0
- package/rules/nestjs/file-uploads/references/upload-patterns.md +125 -0
- package/rules/nestjs/observability/SKILL.md +39 -0
- package/rules/nestjs/observability/references/REFERENCE.md +13 -0
- package/rules/nestjs/observability/references/logging-metrics.md +175 -0
- package/rules/nestjs/performance/SKILL.md +60 -0
- package/rules/nestjs/performance/references/REFERENCE.md +13 -0
- package/rules/nestjs/performance/references/performance-patterns.md +107 -0
- package/rules/nestjs/real-time/SKILL.md +45 -0
- package/rules/nestjs/real-time/references/REFERENCE.md +13 -0
- package/rules/nestjs/real-time/references/websocket-patterns.md +121 -0
- package/rules/nestjs/scheduling/SKILL.md +39 -0
- package/rules/nestjs/scheduling/references/REFERENCE.md +13 -0
- package/rules/nestjs/scheduling/references/scheduling-patterns.md +137 -0
- package/rules/nestjs/search/SKILL.md +41 -0
- package/rules/nestjs/search/references/REFERENCE.md +13 -0
- package/rules/nestjs/search/references/search-patterns.md +137 -0
- package/rules/nestjs/security/SKILL.md +87 -0
- package/rules/nestjs/security/references/REFERENCE.md +14 -0
- package/rules/nestjs/security/references/authentication.md +151 -0
- package/rules/nestjs/testing/SKILL.md +40 -0
- package/rules/nestjs/testing/references/REFERENCE.md +14 -0
- package/rules/nestjs/testing/references/unit-testing.md +179 -0
- package/rules/nestjs/transport/SKILL.md +45 -0
- package/rules/nestjs/transport/references/REFERENCE.md +13 -0
- package/rules/nestjs/transport/references/microservices-patterns.md +170 -0
- package/rules/nextjs/app-router/SKILL.md +46 -0
- package/rules/nextjs/app-router/references/REFERENCE.md +14 -0
- package/rules/nextjs/app-router/references/routing-patterns.md +182 -0
- package/rules/nextjs/architecture/SKILL.md +44 -0
- package/rules/nextjs/architecture/references/fsd-structure.md +77 -0
- package/rules/nextjs/authentication/SKILL.md +29 -0
- package/rules/nextjs/authentication/references/auth-implementation.md +73 -0
- package/rules/nextjs/caching/SKILL.md +66 -0
- package/rules/nextjs/caching/references/REFERENCE.md +13 -0
- package/rules/nextjs/caching/references/cache-strategies.md +168 -0
- package/rules/nextjs/data-access-layer/SKILL.md +33 -0
- package/rules/nextjs/data-access-layer/references/patterns.md +66 -0
- package/rules/nextjs/data-fetching/SKILL.md +59 -0
- package/rules/nextjs/data-fetching/references/REFERENCE.md +13 -0
- package/rules/nextjs/data-fetching/references/fetch-patterns.md +160 -0
- package/rules/nextjs/internationalization/SKILL.md +105 -0
- package/rules/nextjs/internationalization/references/REFERENCE.md +13 -0
- package/rules/nextjs/internationalization/references/i18n-patterns.md +180 -0
- package/rules/nextjs/optimization/SKILL.md +64 -0
- package/rules/nextjs/optimization/references/REFERENCE.md +13 -0
- package/rules/nextjs/optimization/references/optimization-patterns.md +190 -0
- package/rules/nextjs/rendering/SKILL.md +91 -0
- package/rules/nextjs/rendering/references/REFERENCE.md +13 -0
- package/rules/nextjs/rendering/references/rendering-modes.md +163 -0
- package/rules/nextjs/server-actions/SKILL.md +46 -0
- package/rules/nextjs/server-actions/references/REFERENCE.md +13 -0
- package/rules/nextjs/server-actions/references/action-patterns.md +188 -0
- package/rules/nextjs/server-components/SKILL.md +52 -0
- package/rules/nextjs/server-components/references/REFERENCE.md +13 -0
- package/rules/nextjs/server-components/references/component-patterns.md +175 -0
- package/rules/nextjs/state-management/SKILL.md +73 -0
- package/rules/nextjs/state-management/references/REFERENCE.md +13 -0
- package/rules/nextjs/state-management/references/state-patterns.md +218 -0
- package/rules/nextjs/styling/SKILL.md +31 -0
- package/rules/nextjs/styling/references/implementation.md +56 -0
- package/rules/react/component-patterns/SKILL.md +66 -0
- package/rules/react/component-patterns/references/REFERENCE.md +126 -0
- package/rules/react/hooks/SKILL.md +60 -0
- package/rules/react/hooks/references/REFERENCE.md +132 -0
- package/rules/react/hooks.rule.md +79 -0
- package/rules/react/performance/SKILL.md +69 -0
- package/rules/react/performance/references/REFERENCE.md +143 -0
- package/rules/react/security/SKILL.md +46 -0
- package/rules/react/security/references/REFERENCE.md +170 -0
- package/rules/react/state-management/SKILL.md +56 -0
- package/rules/react/state-management/references/REFERENCE.md +137 -0
- package/rules/react/testing/SKILL.md +45 -0
- package/rules/react/testing/references/REFERENCE.md +149 -0
- package/rules/react/tooling/SKILL.md +39 -0
- package/rules/react/typescript/SKILL.md +53 -0
- package/rules/rust/actix-web/SKILL.md +160 -0
- package/rules/rust/actix-web/references/REFERENCE.md +13 -0
- package/rules/rust/actix-web/references/handler-patterns.md +198 -0
- package/rules/rust/async-graphql/SKILL.md +228 -0
- package/rules/rust/async-graphql/references/REFERENCE.md +13 -0
- package/rules/rust/async-graphql/references/schema-patterns.md +215 -0
- package/rules/rust/axum/SKILL.md +161 -0
- package/rules/rust/axum/references/REFERENCE.md +14 -0
- package/rules/rust/axum/references/handler-patterns.md +97 -0
- package/rules/rust/bevy/SKILL.md +206 -0
- package/rules/rust/bevy/references/REFERENCE.md +13 -0
- package/rules/rust/bevy/references/ecs-patterns.md +226 -0
- package/rules/rust/clap/SKILL.md +217 -0
- package/rules/rust/clap/references/REFERENCE.md +13 -0
- package/rules/rust/clap/references/derive-patterns.md +205 -0
- package/rules/rust/core/SKILL.md +154 -0
- package/rules/rust/core/references/REFERENCE.md +14 -0
- package/rules/rust/core/references/error-handling.md +92 -0
- package/rules/rust/diesel-orm/SKILL.md +176 -0
- package/rules/rust/diesel-orm/references/REFERENCE.md +13 -0
- package/rules/rust/diesel-orm/references/schema-patterns.md +206 -0
- package/rules/rust/rocket/SKILL.md +182 -0
- package/rules/rust/rocket/references/REFERENCE.md +13 -0
- package/rules/rust/rocket/references/handler-patterns.md +209 -0
- package/rules/rust/sea-orm/SKILL.md +230 -0
- package/rules/rust/sea-orm/references/REFERENCE.md +13 -0
- package/rules/rust/sea-orm/references/entity-patterns.md +221 -0
- package/rules/rust/serde-serialization/SKILL.md +150 -0
- package/rules/rust/serde-serialization/references/REFERENCE.md +13 -0
- package/rules/rust/serde-serialization/references/serialization-patterns.md +199 -0
- package/rules/rust/sqlx-database/SKILL.md +140 -0
- package/rules/rust/sqlx-database/references/REFERENCE.md +13 -0
- package/rules/rust/sqlx-database/references/query-patterns.md +210 -0
- package/rules/rust/tauri/SKILL.md +180 -0
- package/rules/rust/tauri/references/REFERENCE.md +13 -0
- package/rules/rust/tauri/references/command-patterns.md +209 -0
- package/rules/rust/tokio-runtime/SKILL.md +167 -0
- package/rules/rust/tokio-runtime/references/REFERENCE.md +14 -0
- package/rules/rust/tokio-runtime/references/async-patterns.md +137 -0
- package/rules/rust/tokio-runtime/references/synchronization.md +152 -0
- package/rules/rust/tonic/SKILL.md +231 -0
- package/rules/rust/tonic/references/REFERENCE.md +13 -0
- package/rules/rust/tonic/references/service-patterns.md +213 -0
- package/rules/rust/tracing/SKILL.md +214 -0
- package/rules/rust/tracing/references/REFERENCE.md +13 -0
- package/rules/rust/tracing/references/instrumentation.md +187 -0
- package/rules/typescript/best-practices/SKILL.md +108 -0
- package/rules/typescript/best-practices/references/REFERENCE.md +68 -0
- package/rules/typescript/language/SKILL.md +72 -0
- package/rules/typescript/language/references/REFERENCE.md +67 -0
- package/rules/typescript/patterns.rule.md +85 -0
- package/rules/typescript/security/SKILL.md +59 -0
- package/rules/typescript/security/references/REFERENCE.md +113 -0
- package/rules/typescript/tooling/SKILL.md +52 -0
- package/rules/typescript/tooling/references/REFERENCE.md +110 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# C# Best Practices Reference
|
|
2
|
+
|
|
3
|
+
Project structure, dependency injection, and configuration patterns.
|
|
4
|
+
|
|
5
|
+
## References
|
|
6
|
+
|
|
7
|
+
- [**Project Structure**](project-structure.md) - Clean Architecture layout.
|
|
8
|
+
- [**DI Lifetimes**](di-lifetimes.md) - Transient, Scoped, Singleton comparison.
|
|
9
|
+
- [**Logging**](logging.md) - Structured logging best practices.
|
|
10
|
+
|
|
11
|
+
## Project Structure (Clean Architecture)
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
src/
|
|
15
|
+
├── Domain/ # Core business logic (no dependencies)
|
|
16
|
+
│ ├── Entities/
|
|
17
|
+
│ │ ├── User.cs
|
|
18
|
+
│ │ └── Order.cs
|
|
19
|
+
│ ├── ValueObjects/
|
|
20
|
+
│ │ └── Money.cs
|
|
21
|
+
│ ├── Enums/
|
|
22
|
+
│ │ └── OrderStatus.cs
|
|
23
|
+
│ └── Interfaces/
|
|
24
|
+
│ ├── IUserRepository.cs
|
|
25
|
+
│ └── IOrderRepository.cs
|
|
26
|
+
│
|
|
27
|
+
├── Application/ # Use cases (depends on Domain)
|
|
28
|
+
│ ├── Common/
|
|
29
|
+
│ │ ├── Interfaces/
|
|
30
|
+
│ │ │ └── IEmailService.cs
|
|
31
|
+
│ │ └── Behaviors/
|
|
32
|
+
│ │ └── ValidationBehavior.cs
|
|
33
|
+
│ ├── Users/
|
|
34
|
+
│ │ ├── Commands/
|
|
35
|
+
│ │ │ └── CreateUserCommand.cs
|
|
36
|
+
│ │ └── Queries/
|
|
37
|
+
│ │ └── GetUserQuery.cs
|
|
38
|
+
│ └── DependencyInjection.cs
|
|
39
|
+
│
|
|
40
|
+
├── Infrastructure/ # External concerns (DB, Email, etc.)
|
|
41
|
+
│ ├── Data/
|
|
42
|
+
│ │ ├── AppDbContext.cs
|
|
43
|
+
│ │ └── Repositories/
|
|
44
|
+
│ │ └── UserRepository.cs
|
|
45
|
+
│ ├── Services/
|
|
46
|
+
│ │ └── EmailService.cs
|
|
47
|
+
│ └── DependencyInjection.cs
|
|
48
|
+
│
|
|
49
|
+
└── WebApi/ # Presentation layer
|
|
50
|
+
├── Controllers/
|
|
51
|
+
│ └── UsersController.cs
|
|
52
|
+
├── Middleware/
|
|
53
|
+
│ └── ExceptionMiddleware.cs
|
|
54
|
+
└── Program.cs
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## DI Lifetime Comparison
|
|
58
|
+
|
|
59
|
+
| Lifetime | Created | Disposed | Use Case |
|
|
60
|
+
|----------|---------|----------|----------|
|
|
61
|
+
| **Transient** | Every request | After use | Lightweight, stateless services |
|
|
62
|
+
| **Scoped** | Once per HTTP request | End of request | DbContext, UnitOfWork |
|
|
63
|
+
| **Singleton** | Once per app | App shutdown | Caches, HttpClientFactory |
|
|
64
|
+
|
|
65
|
+
```csharp
|
|
66
|
+
// Registration examples
|
|
67
|
+
services.AddTransient<IEmailSender, EmailSender>(); // New instance each time
|
|
68
|
+
services.AddScoped<IUserRepository, UserRepository>(); // Per HTTP request
|
|
69
|
+
services.AddSingleton<ICacheService, MemoryCacheService>(); // App lifetime
|
|
70
|
+
|
|
71
|
+
// Common mistake: Scoped in Singleton (captive dependency)
|
|
72
|
+
// ❌ DON'T: Singleton depending on Scoped
|
|
73
|
+
public class SingletonService(IScopedService scoped) { } // Runtime error!
|
|
74
|
+
|
|
75
|
+
// ✅ DO: Use IServiceScopeFactory for scoped in singleton
|
|
76
|
+
public class SingletonService(IServiceScopeFactory scopeFactory)
|
|
77
|
+
{
|
|
78
|
+
public async Task DoWork()
|
|
79
|
+
{
|
|
80
|
+
using var scope = scopeFactory.CreateScope();
|
|
81
|
+
var scoped = scope.ServiceProvider.GetRequiredService<IScopedService>();
|
|
82
|
+
await scoped.ProcessAsync();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Logging Best Practices
|
|
88
|
+
|
|
89
|
+
```csharp
|
|
90
|
+
// Log levels usage
|
|
91
|
+
public class OrderProcessor(ILogger<OrderProcessor> logger)
|
|
92
|
+
{
|
|
93
|
+
public async Task ProcessAsync(Order order)
|
|
94
|
+
{
|
|
95
|
+
// Trace: Very detailed, only for debugging specific issues
|
|
96
|
+
logger.LogTrace("Processing order with data: {@Order}", order);
|
|
97
|
+
|
|
98
|
+
// Debug: Development diagnostics
|
|
99
|
+
logger.LogDebug("Starting order processing for {OrderId}", order.Id);
|
|
100
|
+
|
|
101
|
+
// Information: Normal operation milestones
|
|
102
|
+
logger.LogInformation("Order {OrderId} processed successfully", order.Id);
|
|
103
|
+
|
|
104
|
+
// Warning: Unexpected but handled situations
|
|
105
|
+
if (order.Items.Count == 0)
|
|
106
|
+
logger.LogWarning("Order {OrderId} has no items", order.Id);
|
|
107
|
+
|
|
108
|
+
// Error: Failures that need attention
|
|
109
|
+
try { await SendEmailAsync(order); }
|
|
110
|
+
catch (Exception ex)
|
|
111
|
+
{
|
|
112
|
+
logger.LogError(ex, "Failed to send email for order {OrderId}", order.Id);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Critical: App-breaking failures
|
|
116
|
+
// logger.LogCritical("Database connection lost");
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// High-performance logging with source generators
|
|
121
|
+
public static partial class LogMessages
|
|
122
|
+
{
|
|
123
|
+
[LoggerMessage(Level = LogLevel.Information, Message = "Order {OrderId} created by {UserId}")]
|
|
124
|
+
public static partial void OrderCreated(this ILogger logger, int orderId, int userId);
|
|
125
|
+
|
|
126
|
+
[LoggerMessage(Level = LogLevel.Error, Message = "Payment failed for order {OrderId}")]
|
|
127
|
+
public static partial void PaymentFailed(this ILogger logger, int orderId, Exception ex);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Usage
|
|
131
|
+
logger.OrderCreated(order.Id, user.Id);
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Configuration Patterns
|
|
135
|
+
|
|
136
|
+
```csharp
|
|
137
|
+
// appsettings.json structure
|
|
138
|
+
{
|
|
139
|
+
"Database": {
|
|
140
|
+
"ConnectionString": "...",
|
|
141
|
+
"CommandTimeout": 30
|
|
142
|
+
},
|
|
143
|
+
"Email": {
|
|
144
|
+
"SmtpHost": "smtp.example.com",
|
|
145
|
+
"SmtpPort": 587,
|
|
146
|
+
"FromAddress": "noreply@example.com"
|
|
147
|
+
},
|
|
148
|
+
"Features": {
|
|
149
|
+
"EnableNewDashboard": true
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Strongly-typed options
|
|
154
|
+
public class DatabaseSettings
|
|
155
|
+
{
|
|
156
|
+
public const string SectionName = "Database";
|
|
157
|
+
|
|
158
|
+
[Required]
|
|
159
|
+
public string ConnectionString { get; init; } = string.Empty;
|
|
160
|
+
|
|
161
|
+
[Range(1, 300)]
|
|
162
|
+
public int CommandTimeout { get; init; } = 30;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Registration with validation
|
|
166
|
+
builder.Services.AddOptions<DatabaseSettings>()
|
|
167
|
+
.BindConfiguration(DatabaseSettings.SectionName)
|
|
168
|
+
.ValidateDataAnnotations()
|
|
169
|
+
.ValidateOnStart(); // Fail fast at startup
|
|
170
|
+
|
|
171
|
+
// Usage patterns
|
|
172
|
+
public class DataService(IOptions<DatabaseSettings> options)
|
|
173
|
+
{
|
|
174
|
+
// IOptions<T> - Singleton, read once at startup
|
|
175
|
+
private readonly DatabaseSettings _settings = options.Value;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
public class FeatureService(IOptionsSnapshot<DatabaseSettings> options)
|
|
179
|
+
{
|
|
180
|
+
// IOptionsSnapshot<T> - Scoped, re-reads on each request
|
|
181
|
+
public void DoWork() => Console.WriteLine(options.Value.CommandTimeout);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
public class BackgroundService(IOptionsMonitor<DatabaseSettings> options)
|
|
185
|
+
{
|
|
186
|
+
// IOptionsMonitor<T> - Singleton with change notifications
|
|
187
|
+
public BackgroundService()
|
|
188
|
+
{
|
|
189
|
+
options.OnChange(settings => Console.WriteLine("Config changed!"));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Extension Method Patterns
|
|
195
|
+
|
|
196
|
+
```csharp
|
|
197
|
+
// Service registration extensions
|
|
198
|
+
public static class ServiceCollectionExtensions
|
|
199
|
+
{
|
|
200
|
+
public static IServiceCollection AddInfrastructure(
|
|
201
|
+
this IServiceCollection services,
|
|
202
|
+
IConfiguration configuration)
|
|
203
|
+
{
|
|
204
|
+
// Database
|
|
205
|
+
services.AddDbContext<AppDbContext>(options =>
|
|
206
|
+
options.UseSqlServer(configuration.GetConnectionString("Default")));
|
|
207
|
+
|
|
208
|
+
// Repositories
|
|
209
|
+
services.AddScoped<IUserRepository, UserRepository>();
|
|
210
|
+
services.AddScoped<IOrderRepository, OrderRepository>();
|
|
211
|
+
|
|
212
|
+
// External services
|
|
213
|
+
services.AddHttpClient<IPaymentClient, PaymentClient>(client =>
|
|
214
|
+
{
|
|
215
|
+
client.BaseAddress = new Uri(configuration["Payment:BaseUrl"]!);
|
|
216
|
+
client.Timeout = TimeSpan.FromSeconds(30);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
return services;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Usage in Program.cs
|
|
224
|
+
builder.Services
|
|
225
|
+
.AddInfrastructure(builder.Configuration)
|
|
226
|
+
.AddApplication();
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Naming Convention Examples
|
|
230
|
+
|
|
231
|
+
```csharp
|
|
232
|
+
// ✅ Correct naming
|
|
233
|
+
public interface IUserRepository { } // Interface: IPascalCase
|
|
234
|
+
public class UserRepository : IUserRepository // Class: PascalCase
|
|
235
|
+
{
|
|
236
|
+
private readonly DbContext _context; // Private field: _camelCase
|
|
237
|
+
private readonly ILogger<UserRepository> _logger;
|
|
238
|
+
|
|
239
|
+
public string ConnectionString { get; } // Property: PascalCase
|
|
240
|
+
public event EventHandler? UserCreated; // Event: PascalCase
|
|
241
|
+
|
|
242
|
+
public async Task<User?> GetByIdAsync( // Method: PascalCase
|
|
243
|
+
int userId, // Parameter: camelCase
|
|
244
|
+
CancellationToken cancellationToken)
|
|
245
|
+
{
|
|
246
|
+
var user = await _context.Users // Local: camelCase
|
|
247
|
+
.FindAsync(userId, cancellationToken);
|
|
248
|
+
return user;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
public class Repository<TEntity> // Type parameter: TPascalCase
|
|
253
|
+
where TEntity : class { }
|
|
254
|
+
|
|
255
|
+
public const string DefaultRole = "User"; // Constant: PascalCase
|
|
256
|
+
```
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Blazor
|
|
3
|
+
description: Blazor component patterns for interactive web UIs.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [blazor, components, wasm, server]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/*.razor', '**/*.razor.cs']
|
|
8
|
+
keywords: [Component, Parameter, CascadingParameter, EventCallback, StateHasChanged]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Blazor
|
|
12
|
+
|
|
13
|
+
## **Priority: P1 (OPERATIONAL)**
|
|
14
|
+
|
|
15
|
+
Blazor component patterns for interactive web UIs.
|
|
16
|
+
|
|
17
|
+
## Implementation Guidelines
|
|
18
|
+
|
|
19
|
+
- **Components**: Keep components focused. Split large components into smaller ones.
|
|
20
|
+
- **Parameters**: Use `[Parameter]` for one-way, `EventCallback` for two-way binding.
|
|
21
|
+
- **Cascading Values**: Use for app-wide state (theme, user context).
|
|
22
|
+
- **State Management**: Component state for local, Fluxor/custom service for global.
|
|
23
|
+
- **Forms**: `EditForm` with `DataAnnotationsValidator` or FluentValidation.
|
|
24
|
+
- **JS Interop**: Use `IJSRuntime` sparingly. Prefer Blazor bindings.
|
|
25
|
+
- **Render Modes**: Choose based on requirements (Server, WASM, Auto in .NET 8+).
|
|
26
|
+
- **Streaming**: Use `[StreamRendering]` for long-loading components.
|
|
27
|
+
|
|
28
|
+
## Anti-Patterns
|
|
29
|
+
|
|
30
|
+
- **No direct DOM manipulation**: Use Blazor bindings and refs.
|
|
31
|
+
- **No `StateHasChanged()` in lifecycle**: Called automatically after lifecycle methods.
|
|
32
|
+
- **No heavy computation in render**: Move to `OnInitialized` or background task.
|
|
33
|
+
- **No sync JS interop in Server mode**: Causes UI blocking.
|
|
34
|
+
|
|
35
|
+
## Code
|
|
36
|
+
|
|
37
|
+
```razor
|
|
38
|
+
@* UserList.razor *@
|
|
39
|
+
@page "/users"
|
|
40
|
+
@attribute [StreamRendering]
|
|
41
|
+
@inject IUserService UserService
|
|
42
|
+
|
|
43
|
+
<PageTitle>Users</PageTitle>
|
|
44
|
+
|
|
45
|
+
<h3>Users</h3>
|
|
46
|
+
|
|
47
|
+
@if (_users is null)
|
|
48
|
+
{
|
|
49
|
+
<p><em>Loading...</em></p>
|
|
50
|
+
}
|
|
51
|
+
else if (_users.Count == 0)
|
|
52
|
+
{
|
|
53
|
+
<p>No users found.</p>
|
|
54
|
+
}
|
|
55
|
+
else
|
|
56
|
+
{
|
|
57
|
+
<div class="user-grid">
|
|
58
|
+
@foreach (var user in _users)
|
|
59
|
+
{
|
|
60
|
+
<UserCard User="user" OnDelete="HandleDelete" />
|
|
61
|
+
}
|
|
62
|
+
</div>
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@code {
|
|
66
|
+
private List<User>? _users;
|
|
67
|
+
|
|
68
|
+
protected override async Task OnInitializedAsync()
|
|
69
|
+
{
|
|
70
|
+
_users = await UserService.GetAllAsync();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private async Task HandleDelete(int userId)
|
|
74
|
+
{
|
|
75
|
+
await UserService.DeleteAsync(userId);
|
|
76
|
+
_users = await UserService.GetAllAsync();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```razor
|
|
82
|
+
@* UserCard.razor - Reusable component *@
|
|
83
|
+
<div class="card">
|
|
84
|
+
<h5>@User.Name</h5>
|
|
85
|
+
<p>@User.Email</p>
|
|
86
|
+
<button @onclick="() => OnDelete.InvokeAsync(User.Id)">Delete</button>
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
@code {
|
|
90
|
+
[Parameter, EditorRequired]
|
|
91
|
+
public User User { get; set; } = default!;
|
|
92
|
+
|
|
93
|
+
[Parameter]
|
|
94
|
+
public EventCallback<int> OnDelete { get; set; }
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
```razor
|
|
99
|
+
@* EditForm with validation *@
|
|
100
|
+
<EditForm Model="@_model" OnValidSubmit="HandleSubmit" FormName="CreateUser">
|
|
101
|
+
<DataAnnotationsValidator />
|
|
102
|
+
<ValidationSummary class="text-danger" />
|
|
103
|
+
|
|
104
|
+
<div class="mb-3">
|
|
105
|
+
<label class="form-label">Name</label>
|
|
106
|
+
<InputText @bind-Value="_model.Name" class="form-control" />
|
|
107
|
+
<ValidationMessage For="@(() => _model.Name)" />
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<div class="mb-3">
|
|
111
|
+
<label class="form-label">Email</label>
|
|
112
|
+
<InputText @bind-Value="_model.Email" class="form-control" type="email" />
|
|
113
|
+
<ValidationMessage For="@(() => _model.Email)" />
|
|
114
|
+
</div>
|
|
115
|
+
|
|
116
|
+
<button type="submit" class="btn btn-primary" disabled="@_isSubmitting">
|
|
117
|
+
@if (_isSubmitting)
|
|
118
|
+
{
|
|
119
|
+
<span class="spinner-border spinner-border-sm"></span>
|
|
120
|
+
}
|
|
121
|
+
Submit
|
|
122
|
+
</button>
|
|
123
|
+
</EditForm>
|
|
124
|
+
|
|
125
|
+
@code {
|
|
126
|
+
private CreateUserModel _model = new();
|
|
127
|
+
private bool _isSubmitting;
|
|
128
|
+
|
|
129
|
+
private async Task HandleSubmit()
|
|
130
|
+
{
|
|
131
|
+
_isSubmitting = true;
|
|
132
|
+
await UserService.CreateAsync(_model);
|
|
133
|
+
_isSubmitting = false;
|
|
134
|
+
NavigationManager.NavigateTo("/users");
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Reference & Examples
|
|
140
|
+
|
|
141
|
+
For lifecycle, state management, and JS interop:
|
|
142
|
+
See [references/REFERENCE.md](references/REFERENCE.md).
|
|
143
|
+
|
|
144
|
+
## Related Topics
|
|
145
|
+
|
|
146
|
+
aspnet-core | razor-pages | security
|