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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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