由于Akka.net系统只返回一个引用(IActorRef)给Actor,你只能通过Tell()和Ask()与Actor交互,其中参数不是强类型的,只是类型为object base ......我脑子里有一些问题。
如何确保在编译时与正确的Actor类型“交谈”? (例如,如果您只在类的构造函数中接收IActorRef而不是具体的接口契约或通过对Actor系统的请求,那么您不知道Actor能够处理该消息) 如何确保Actor属于特定类型以及如何知道您为此类型选择了正确的消息?
即使松耦合很好,它还有比使用“TellAnything”一个对象契约方法(从我的观点来看)优势更多的缺点,而且Microsoft Orleans Grains在我看来更合适,因为你可以拥有一个明确的界面。我是否会错过Akka.net提供的具有严肃合同的功能?
具有明确界面的Microsoft奥尔良:
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 and Ask(带对象参数):
Akka.net中有类似的东西允许明确的合同吗?我知道在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);
如何确保“接口的客户端只使用正确的命令?”
如果Akka.net有这样的话会很好:
Props consoleWriterProps = Props.Create<ConsoleWriterActor>();
IConsoleWriter consoleWriterActor = MyActorSystem.ActorOf<IConsoleWriter>(consoleWriterProps, "consoleWriterActor");
consoleReaderActor.MyExplicitCallThatAllowsOnlyStartCommandType(ConsoleReaderActor.StartCommand);
答案 0 :(得分:1)
您可以通过Akka.Interfaced使用接口契约,但这会引入下一级别的复杂性和间接性,这可能会导致性能下降,阻止某些更高级的消息传递模式以及您的actor中的动态行为切换。
其他方法是用IActorRef
包装它的类型版本,允许您确保只有特定类型的消息可以通过Tell方法传递 - 这正是Akkling的工作方式。