【特性】【db】新增IReadOnlyXXX 类型bean接口,同时生成的table.Select及SelectAsync返回只读接口类型

main
walon 2021-04-14 13:51:27 +08:00
parent 2b6a1b04c2
commit 1c59a3d0d0
4 changed files with 62 additions and 4 deletions

View File

@ -5,6 +5,8 @@ namespace Luban.Job.Common.Types
{
public class TMap : TType
{
public bool IsMap => true;
public TType KeyType { get; }
public TType ValueType { get; }

View File

@ -12,6 +12,11 @@ namespace Luban.Job.Db.Defs
return type.Apply(DbCsDefineTypeVisitor.Ins);
}
public static string DbCsReadonlyDefineType(TType type)
{
return type.Apply(DbCsReadOnlyDefineTypeVisitor.Ins);
}
public static string CsImmutableType(TType type)
{
return type.Apply(ImmutableTypeName.Ins);

View File

@ -43,13 +43,21 @@ namespace Luban.Job.Db.Generate
fields = x.fields
hierarchy_fields = x.hierarchy_fields
is_abstract_type = x.is_abstract_type
readonly_name = ""IReadOnly"" + name
}}
using Bright.Serialization;
namespace {{x.namespace_with_top_module}}
{
public interface {{readonly_name}} {{if parent_def_type}}: IReadOnly{{x.parent}} {{end}}
{
{{~ for field in fields~}}
{{db_cs_readonly_define_type field.ctype}} {{field.cs_style_name}} {get;}
{{~end~}}
}
public {{x.cs_class_modifier}} class {{name}} : {{if parent_def_type}} {{x.parent}} {{else}} Bright.Transaction.TxnBeanBase {{end}}, Bright.Transaction.IUnsafeBean
public {{x.cs_class_modifier}} class {{name}} : {{if parent_def_type}} {{x.parent}} {{else}} Bright.Transaction.TxnBeanBase {{end}}, {{readonly_name}} , Bright.Transaction.IUnsafeBean
{
{{~ for field in fields~}}
{{if is_abstract_type}}protected{{else}}private{{end}} {{db_cs_define_type field.ctype}} {{field.internal_name}};
@ -63,6 +71,7 @@ public {{x.cs_class_modifier}} class {{name}} : {{if parent_def_type}} {{x.paren
}
{{~ for field in fields~}}
{{ctype = field.ctype}}
{{~if has_setter field.ctype~}}
private sealed class {{field.log_type}} : Bright.Transaction.FieldLogger<{{name}}, {{db_cs_define_type field.ctype}}>
@ -142,6 +151,12 @@ public {{x.cs_class_modifier}} class {{name}} : {{if parent_def_type}} {{x.paren
public {{db_cs_define_type field.ctype}} {{field.cs_style_name}} => {{field.internal_name}};
{{~end~}}
{{~if ctype.bean || ctype.element_type ~}}
{{db_cs_readonly_define_type ctype}} {{readonly_name}}.{{field.cs_style_name}} => {{field.internal_name}};
{{~else if ctype.is_map~}}
{{db_cs_readonly_define_type ctype}} {{readonly_name}}.{{field.cs_style_name}} => new Bright.Transaction.Collections.PReadOnlyMap<{{db_cs_readonly_define_type ctype.key_type}}, {{db_cs_readonly_define_type ctype.value_type}}, {{db_cs_define_type ctype.value_type}}>({{field.internal_name}});
{{~end~}}
{{~end~}}
{{~if is_abstract_type~}}
@ -273,14 +288,14 @@ public sealed class {{name}}
Table.Put(key, value);
}
public static {{db_cs_define_type value_ttype}} Select({{db_cs_define_type key_ttype}} key)
public static {{db_cs_readonly_define_type value_ttype}} Select({{db_cs_define_type key_ttype}} key)
{
return Table.Select(key);
}
public static ValueTask<{{db_cs_define_type value_ttype}}> SelectAsync({{db_cs_define_type key_ttype}} key)
public static ValueTask<{{db_cs_readonly_define_type value_ttype}}> SelectAsync({{db_cs_define_type key_ttype}} key)
{
return Table.SelectAsync<{{db_cs_define_type value_ttype}}>(key);
return Table.SelectAsync<{{db_cs_readonly_define_type value_ttype}}>(key);
}
}
}

View File

@ -0,0 +1,36 @@
using Luban.Job.Common.Types;
using Luban.Job.Common.TypeVisitors;
namespace Luban.Job.Db.TypeVisitors
{
class DbCsReadOnlyDefineTypeVisitor : DecoratorFuncVisitor<string>
{
public static DbCsReadOnlyDefineTypeVisitor Ins { get; } = new DbCsReadOnlyDefineTypeVisitor();
public override string DoAccept(TType type)
{
return type.Apply(CsDefineTypeName.Ins);
}
public override string Accept(TBean type)
{
return $"{type.Bean.NamespaceWithTopModule}.IReadOnly{type.Bean.Name}";
}
public override string Accept(TList type)
{
return $"System.Collections.Generic.IReadOnlyList<{type.ElementType.Apply(this)}>";
}
public override string Accept(TSet type)
{
return $"System.Collections.Generic.IReadOnlySet<{type.ElementType.Apply(this)}>";
}
public override string Accept(TMap type)
{
return $"System.Collections.Generic.IReadOnlyDictionary<{type.KeyType.Apply(this)}, {type.ValueType.Apply(this)}>";
}
}
}