Skip to content

[Feature] XCodeTool 自动生成多租户表时,Biz.cs 应默认实现 ITenantScope 接口 #96

Description

@nygula

当前 EntityBuilder 在生成业务类(.Biz.cs)时,已经能够根据表中是否存在 TenantId 字段自动添加 TenantInterceptor:

  if (ns.Contains("TenantId"))
      WriteLine("Meta.Interceptors.Add<TenantInterceptor>();");

但是,生成的业务类声明中并不会自动实现 ITenantScope 接口。开发者需要每次手动修改生成的 .Biz.cs,例如:

  public partial class Department : Entity<Department>, ITenantScope

这容易遗漏,且与 TenantInterceptor 的自动注入逻辑不一致。

期望行为

当表中包含 TenantId 字段时,自动将业务类的基类声明追加 ITenantScope,生成结果如下:

  public partial class SomeEntity : Entity<SomeEntity>, ITenantScope

同时在静态构造函数中保持已有的:

  Meta.Interceptors.Add<TenantInterceptor>();

建议实现

在 XCode/Code/EntityBuilder.cs 的 GetBaseClass() 方法中,针对业务类增加多租户判断:

  // 多租户表额外实现 ITenantScope 接口
  if (Table.Columns.Any(e => e.Name.EqualIgnoreCase("TenantId")) && !name.Contains("ITenantScope"))
      name += ", ITenantScope";

判断规则

• 以 不区分大小写 的方式匹配列名 TenantId。
• 仅在生成 业务类(Biz.cs) 时追加接口,数据类(.cs)保持现状。
• 如果基类中已包含 ITenantScope,则避免重复添加。

影响范围

• 对已有无 TenantId 字段的表无任何影响。
• 对 Tenant 表本身(无 TenantId 列,而是通过 Id 映射)不自动处理,仍需手写显式接口实现,符合其特殊性。

相关文件

• XCode/Code/EntityBuilder.cs
• XUnitTest.XCode/Code/Entity/部门.Biz.cs
• XUnitTest.XCode/Code/Entity/角色.Biz.cs
• XUnitTest.XCode/Code/Entity/租户关系.Biz.cs

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions