From d08ce37898116d072c08a5e8f350c17b5d22b9a5 Mon Sep 17 00:00:00 2001 From: pangdogs Date: Sat, 18 Jan 2025 22:29:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- runtime_generic.go | 12 ++++++++---- service_generic.go | 9 ++++++--- service_instance.go | 3 ++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/runtime_generic.go b/runtime_generic.go index 499f9e1..81089db 100644 --- a/runtime_generic.go +++ b/runtime_generic.go @@ -37,6 +37,7 @@ import ( "git.golaxy.org/framework/addins/rpcstack" etcdv3 "go.etcd.io/etcd/client/v3" "go.uber.org/zap" + "sync" ) type _RuntimeSettings struct { @@ -55,6 +56,7 @@ type iRuntimeGeneric interface { // RuntimeGeneric 运行时泛化类型 type RuntimeGeneric struct { + once sync.Once svcInst IServiceInstance instance any handleEntityManagerAddEntity runtime.EventEntityManagerAddEntityHandler @@ -62,10 +64,12 @@ type RuntimeGeneric struct { } func (r *RuntimeGeneric) init(svcCtx service.Context, instance any) { - r.svcInst = reinterpret.Cast[IServiceInstance](svcCtx) - r.instance = instance - r.handleEntityManagerAddEntity = runtime.HandleEventEntityManagerAddEntity(r.onEntityManagerAddEntity) - r.handleEntityManagerEntityAddComponents = runtime.HandleEventEntityManagerEntityAddComponents(r.onEntityManagerEntityAddComponents) + r.once.Do(func() { + r.svcInst = reinterpret.Cast[IServiceInstance](svcCtx) + r.instance = instance + r.handleEntityManagerAddEntity = runtime.HandleEventEntityManagerAddEntity(r.onEntityManagerAddEntity) + r.handleEntityManagerEntityAddComponents = runtime.HandleEventEntityManagerEntityAddComponents(r.onEntityManagerEntityAddComponents) + }) } func (r *RuntimeGeneric) generate(settings _RuntimeSettings) core.Runtime { diff --git a/service_generic.go b/service_generic.go index 6955200..41c1b43 100644 --- a/service_generic.go +++ b/service_generic.go @@ -59,15 +59,18 @@ type iServiceGeneric interface { // ServiceGeneric 服务泛化类型 type ServiceGeneric struct { + once sync.Once startupConf *viper.Viper name string instance any } func (s *ServiceGeneric) init(startupConf *viper.Viper, name string, instance any) { - s.startupConf = startupConf - s.name = name - s.instance = instance + s.once.Do(func() { + s.startupConf = startupConf + s.name = name + s.instance = instance + }) } func (s *ServiceGeneric) generate(ctx context.Context, no int) core.Service { diff --git a/service_instance.go b/service_instance.go index e730987..4ad081e 100644 --- a/service_instance.go +++ b/service_instance.go @@ -75,6 +75,7 @@ type IServiceInstance interface { // ServiceInstance 服务实例 type ServiceInstance struct { service.ContextBehavior + runtimeGeneric RuntimeGeneric } // GetConf 获取配置插件 @@ -141,7 +142,7 @@ func (inst *ServiceInstance) GetMemKV() *sync.Map { // CreateRuntime 创建运行时 func (inst *ServiceInstance) CreateRuntime() RuntimeCreator { - return CreateRuntime(service.UnsafeContext(inst).GetOptions().InstanceFace.Iface) + return CreateRuntime(service.UnsafeContext(inst).GetOptions().InstanceFace.Iface).Setup(&inst.runtimeGeneric) } // CreateEntityPT 创建实体原型