通过子类继承或编程方式为域模型添加DynamoDB数据注解方案问询
方案1:继承域模型在子类加注解(完全可行)
- AWS .NET SDK的DynamoDB对象持久化组件原生支持识别类继承链上的注解,你可以完全不侵入原有纯净域模型,仅在继承的持久化子类上添加存储端专属注解即可
- 实操注意点:
- 如果需要给父类已有的属性加DynamoDB相关注解,将父类对应属性声明为
virtual,在子类中用override重写该属性后添加注解即可被SDK正确识别 - 子类可以直接在类上标注
[DynamoDBTable]指定表名,不需要修改父类任何代码 - 示例代码参考:
// 纯域模型,无任何存储相关依赖 public class User { public virtual string UserId { get; set; } public virtual string UserName { get; set; } public virtual DateTime RegisterTime { get; set; } } // DynamoDB专属持久化子类 [DynamoDBTable("Users")] public class DynamoUser : User { [DynamoDBHashKey] public override string UserId { get; set; } [DynamoDBLocalSecondaryIndexRangeKey("RegisterTimeIndex")] public override DateTime RegisterTime { get; set; } }
- 如果需要给父类已有的属性加DynamoDB相关注解,将父类对应属性声明为
方案2:编程式动态配置注解(官方原生支持,无需反射 hack)
- 你不需要通过反射等方式动态给类硬加注解,DynamoDB .NET SDK 原生提供了脱离属性注解的编程式映射配置能力,所有存储规则可以统一注册,完全不触碰域模型代码,也不需要额外维护子类
- 示例代码参考:
// 直接给纯域模型配置DynamoDB映射规则 var userTableConfig = new TableBuilder<User>() .WithTableName("Users") .WithHashKey(u => u.UserId, DynamoDBEntryType.String) .WithLocalSecondaryIndex("RegisterTimeIndex", idx => idx.WithRangeKey(u => u.RegisterTime, DynamoDBEntryType.Number)) .Build(); // 注册配置到DynamoDB上下文即可正常使用 var dynamoClient = new AmazonDynamoDBClient(); var dbContext = new DynamoDBContext(dynamoClient, new DynamoDBContextConfig()); dbContext.RegisterTableConfig(userTableConfig);
选型参考
- 如果你偏好属性和注解一一绑定的组织形式,且存储结构和域模型差异很小,选择子类继承方案更直观,代码可读性更高
- 如果你需要集中管理所有存储映射规则,或者后续映射规则调整频率较高,选择官方编程式配置方案更灵活,维护成本更低
内容的提问来源于stack exchange,提问作者JakeHova
相关产品推荐
相关产品推荐

