
Custom Attributes
Namespace:
ZhonTai.Admin.Core.Attributes
Zhongtai Admin provides a rich set of custom attributes for declarative control over transactions, permissions, DI lifecycle, data generation, and more.
Transaction Attributes
[Transaction]
Declarative transaction management via AOP interception.
csharp
[Transaction]
public async Task CreateOrder(OrderEntity order)
{
await _orderRepo.InsertAsync(order);
await _stockRepo.UpdateAsync(...);
// Automatically rolls back on exception
}[AdminTransaction]
Extends Transaction, defaults to using DbKeys.AdminDb (admin database).
csharp
[AdminTransaction]
public async Task UpdatePermission(...) { }Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
Propagation | Propagation | Required | Transaction propagation behavior |
IsolationLevel | IsolationLevel | - | Isolation level |
DbKey | string | - | Target database |
WARNING
Requires Aop.Transaction = true in appconfig.json to take effect.
Permission & Access Attributes
[Login]
Marks a login endpoint. Skips permission validation but still requires JWT authentication.
csharp
[Login]
public async Task<IResultOutput<TokenInfo>> Login(LoginInput input) { }[ValidatePermission]
Marks endpoints that require login + permission validation (default behavior, usually no need to add explicitly).
[ApiAccess]
Endpoint-level access control, restricting access by operation button unique codes.
csharp
[ApiAccess(All = false, Codes = new[] { "api:admin:module:delete", "api:admin:module:batchdelete" })]
public async Task Delete(long id) { }| Parameter | Description |
|---|---|
All | Default false. true = all codes must be satisfied for access, false = any one code is sufficient |
Codes | List of allowed access codes |
[NoOperationLog]
Disables operation logging for the endpoint.
csharp
[NoOperationLog]
public async Task<IResultOutput> Ping() { }Database Attributes
[Database]
Marks the target database for an entity (multi-database scenarios).
csharp
[Database("LogDb")]
public class LogEntity : EntityBase { }[AdminTransaction]
Uses the specified database for transactions. See Transaction Attributes above.
DI Lifecycle Attributes
Controls automatic IOC container registration lifecycle.
csharp
[InjectSingleton]
public class MyCacheService { }
[InjectScoped]
public class MyService { }
[InjectTransient]
public class MyTool { }[NonRegisterIOC]
Excludes from automatic IOC registration; requires manual registration.
csharp
[NonRegisterIOC]
public class MyCustomService { }ID Generation Attributes
[Snowflake]
Auto-generates Snowflake ID for primary key (built into Entity.Id).
- Optimized Snowflake algorithm (snowflake drift) — generates shorter IDs at higher speed.
- Supports auto-scaling in container environments like K8s (auto-registers WorkerId), capable of generating unique numeric IDs in both standalone and distributed environments.
- If ID generation demand does not exceed 50K/s, no configuration changes are needed.
- If between 50K/s and 500K/s, it is recommended to set
SeqBitLength=10. - If between 500K/s and 5M/s, it is recommended to set
SeqBitLength=12.
csharp
[Snowflake]
public long Id { get; set; }[OrderGuid]
Uses ordered Guid for primary key (a design balancing global uniqueness and index performance).
Applicable scenarios:
- Distributed systems: No central sequence generator; each node generates IDs independently — no conflicts when merging data.
- Horizontal sharding: No primary key duplication concerns during Merge/Sharding.
- Security: External-facing IDs are not guessable (unlike auto-increment numbers).
- No external dependencies: No need to rely on database auto-increment, Redis counters, or other external services.
csharp
[OrderGuid]
public Guid Id { get; set; }Time Attributes
[ServerTime]
Auto-assigns server time on insert or update.
csharp
// Auto-assign on insert
[ServerTime]
public DateTime? CreatedTime { get; set; }
// Auto-assign on update only
[ServerTime(CanInsert = false, CanUpdate = true)]
public DateTime? ModifiedTime { get; set; }API Grouping & Routing
[ApiGroup]
Swagger API grouping.
csharp
[ApiGroup("Order Management")]
public class OrderService { }
// Exclude from grouping
[ApiGroup(NonGroup = true)]
public class InternalService { }[VersionRoute]
Versioned routing: /api/{version}/[area]/[controller]/[action]
csharp
[VersionRoute("v1")]
public class OrderService { }[SchemaId]
Custom Swagger SchemaId to avoid conflicts between classes with the same name.
csharp
[SchemaId(Prefix = "Order", Suffix = "Input")]
public class OrderInput { }Data Generation Attributes
[NotGen]
Excludes property during data generation/synchronization.
csharp
[NotGen]
public DateTime SyncTime { get; set; }[ScanCacheKeys]
Marks a cache key constant class for system scanning and registration.
csharp
[ScanCacheKeys]
public static class MyCacheKeys
{
public const string MyData = "MyModule:Data";
}[ScanTaskNames]
Marks a task name constant class for system scanning and registration.