gpt4 book ai didi

interface - 如何确保在编译时将消息发送到 Akka.net 中正确的 Actor?

转载 作者:行者123 更新时间:2023-12-04 17:59:10 27 4
gpt4 key购买 nike

由于 Akka.net 系统仅返回对 Ac​​tor 的引用 (IActorRef),并且您只能通过 Tell() 和 Ask() 与 Actor 交互,其中参数不是强类型的,只是类型对象基...我脑子里浮现出一些问题。

如何确保在编译时与正确的 Actor 类型“对话”? (例如,如果您在类的构造函数中仅收到 IActorRef 而不是具体的接口(interface)契约或通过对 Actor 系统的请求,那么您不知道 Actor 能够处理该消息)您如何确保 Actor 属于特定类型以及如何知道您正在为该类型选择正确的消息?

尽管松散耦合很好,但它的缺点多于“TellAnything”对象契约方法的优点(从我的角度来看),Microsoft Orleans Grains 在我看来更适合这里,因为你可以有一个显式接口(interface).我是否错过了 Akka.net 提供的用于签订正式契约(Contract)的功能?

具有显式接口(interface)的 Microsoft Orleans:

public interface IHello : Orleans.IGrainWithIntegerKey
{
Task<string> SayHello(string greeting);
}

public class HelloGrain : Orleans.Grain, IHello
{
Task<string> SayHello(string greeting)
{
return Task.FromResult($"You said: '{greeting}', I say: Hello!");
}
}

// Get a reference to the IHello grain with id '0'.
var friend = GrainClient.GrainFactory.GetGrain<IHello>(0);

// Send a greeting to the grain and await the response.
Console.WriteLine(await friend.SayHello("Good morning, my friend!"));

Akka.net 仅提示 Tell 和 Ask(带有对象参数):

Akka.net 中是否有类似的东西允许显式契约(Contract)?我知道有支持在 Java 中使用 Akka 的代理,但 Akka.net 似乎没有可比性。

MyActorSystem = ActorSystem.Create("MyActorSystem");

// create top-level actors within the actor system
Props consoleWriterProps = Props.Create<ConsoleWriterActor>();
IActorRef consoleWriterActor = MyActorSystem.ActorOf(consoleWriterProps, "consoleWriterActor");

// now you can tell everything to consoleWriterActor at compile time (even though this Actor only understands a specific message)

// begin processing
consoleReaderActor.Tell(ConsoleReaderActor.StartCommand);

如何保证“接口(interface)”的客户端只使用正确的命令?

如果 Akka.net 有这样的东西就好了:

Props consoleWriterProps = Props.Create<ConsoleWriterActor>();
IConsoleWriter consoleWriterActor = MyActorSystem.ActorOf<IConsoleWriter>(consoleWriterProps, "consoleWriterActor");

consoleReaderActor.MyExplicitCallThatAllowsOnlyStartCommandType(ConsoleReaderActor.StartCommand);

最佳答案

您可以通过 Akka.Interfaced 使用接口(interface)契约,但这会引入下一级的复杂性和间接性,这可能会导致性能下降,阻止一些更高级的消息传递模式和 actor 中的动态行为切换。

其他方法是用它的类型化版本包装IActorRef,以确保只有特定类型的消息可以通过Tell 方法传递——这正是Akkling 的方式。有效。

关于interface - 如何确保在编译时将消息发送到 Akka.net 中正确的 Actor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37607785/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com