C# 无法在服务结构中的一个ActorRuntime中注册两个参与者
我有一个单一的服务结构演员服务。这将创建两个项目,C# 无法在服务结构中的一个ActorRuntime中注册两个参与者,c#,azure-service-fabric,C#,Azure Service Fabric,我有一个单一的服务结构演员服务。这将创建两个项目,ActorService和ActorService.Interfaces 接口包含根参与者的接口,称为IRootActor。ActorService本身包含RootActor和IChildActor,ChildActor。这两个接口都实现了IActor,两个类都继承了Actor,并实现了各自的接口。我在Program.cs中注册这些演员,如下所示: ActorRuntime.RegisterActorAsync<ChildActor>
ActorService
和ActorService.Interfaces
接口包含根参与者的接口,称为IRootActor
。ActorService本身包含RootActor
和IChildActor
,ChildActor
。这两个接口都实现了IActor
,两个类都继承了Actor
,并实现了各自的接口。我在Program.cs中注册这些演员,如下所示:
ActorRuntime.RegisterActorAsync<ChildActor>(
(context, actorType) => new ActorService(context, actorType, () => container.Resolve<ChildActor>()))
.GetAwaiter()
.GetResult();
ActorRuntime.RegisterActorAsync<RootActor>(
(context, actorType) => new ActorService(context, actorType, () => container.Resolve<RootActor.Factory>()(context)))
.GetAwaiter()
.GetResult();
Thread.Sleep(Timeout.Infinite);
一切顺利。前面提到的RootActor.Method
Method在一个循环中做两件事,创建子actor并调用其方法:
IChildActor proxy = ActorProxy.Create<IChildActor>(new ActorId(otherId), sameActorServiceUri);
proxy.OtherMethod(transformedData);
IChildActor proxy=ActorProxy.Create(新ActorId(otherId),sameActorServiceUri);
其他方法(转换数据);
问题来了。调用proxy.OtherMethod
时,基本上会出现以下异常:
HResult=-2146232969
Message=未找到接口的MethodDispatcher
id“230348154”源=Microsoft.ServiceFabric.Actors
我做错什么了吗?考虑到这一点,我认为可以从一个服务中创建两个演员…好的,我想出来了。对于任何挣扎的人来说,问题在于actor服务URI。 我错误地认为两个参与者共享服务URI。正如在中提到的,演员实际上是分开主持的。如果您查看一下
ServiceManifest.xml
,您会发现两个扩展
xml节点,它们都被命名为\uu生成的服务类型
。只需根据childDefaultService
xml节点更改服务名称部分,因此在本例中很可能是ChildActorService
。天哪,听起来很不合适
总而言之,服务结构中任何内容的设置和配置都相当复杂。然而,VS会尽力帮助你。有时你甚至没有预料到这一点,而这本质上是邪恶的根源所在。如果您不知道要查找什么,您将不会查找它。参与者注册良好,使用ActorProxy连接到他们时,如果您要指定服务名称,则需要指定正确的服务名称。您可以省略服务名称,改为指定applicationName,Actor框架将为Actor计算出正确的服务名称。请看关于计算名称的评论是否不准确?您发布的链接提到该名称是从actor实现的接口派生的,但无法在actor实现更多接口时推断出来。。。
IChildActor proxy = ActorProxy.Create<IChildActor>(new ActorId(otherId), sameActorServiceUri);
proxy.OtherMethod(transformedData);