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

标签 interface compile-time type-safety akka.net

由于 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/

相关文章:

java - 覆盖 "equals"方法 : how to figure out the type of the parameter?

java - 在Java中,有没有一种方法可以加载类实现不存在的接口(interface)?

grails - 在 Grails 运行时覆盖 i18n .properties 文件

c++ - 容器类型和编译时类型推导

c++ - 使用 std::is_same<> 的这个条件可以在编译时评估吗?

types - 为什么 Swift 语言指南建议使用 Int "even when values are known to be non-negative"?

java - 如何在 java 中参数化泛型单例

android - 将数据从 DialogFragment 返回到适配器

oop - 继承和接口(interface)

Python - 创建类似命令行的界面来加载模块/函数