2017-03-28 3 views
1

Mein Akteurs-System wird in der Konsolenanwendung initialisiert. Ich konfiguriere einen Akteur Call BankAccrountActor, der verantwortlich ist für Banktransaktionen wie Kredit/Debit/Kontostand eines Kontos. Bei Kredit-/Debit-Befehl wird der Actor den Betrag von Konto und Sender.Tell() mit dem Restguthaben gutschreiben/debitieren. Von meinem program.cs rufe ich BankAccountActor an, um nach Debit zu fragen und Balance mit Ergebnis zu erhalten.Akka.net Absender Nicht-Akteur-Kontext

Problem für mich ist von BankAccountActor ruft Sender.Tell() mit Balance. Hier ist Absender IActorRef Typen und Ergebnis kommt zu Programm-Klasse und Programm ist kein Akteur. Wie ist es möglich?

namespace BankAccount 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     ActorSystem actorSystem = ActorSystem.Create("BankAccountSystem"); 
     Props bankAccountAccProps = Props.Create<BankAccountActor>(); 
     IActorRef bankAccActor = actorSystem.ActorOf(bankAccountAccProps, "abc"); 

     var remainBalance = bankAccActor.Ask<decimal>(new DebitAccMessage(100)).Result; 
    } 
} 
internal class BankAccountActor : ReceiveActor 
{ 
    private decimal _accBalance = 100; 
    public BankAccountActor() 
    { 
     Receive<DebitAccMessage>(message => Debit(message)); 
     Receive<CreditAccMessage>(message => Credit(message)); 
    } 
    public void Debit(DebitAccMessage debitMessage) 
    { 
     _accBalance += debitMessage.Amount; 

     Sender.Tell(_accBalance); 
    } 
    public void Credit(CreditAccMessage debitMessage) 
    { 
     _accBalance -= debitMessage.Amount; 

     Sender.Tell(_accBalance); 
    } 
} 
internal class CreditAccMessage 
{ 
    public CreditAccMessage(decimal amount) 
    { 
     Amount = amount; 
    } 
    public decimal Amount { get; private set; } 
} 
internal class DebitAccMessage 
{ 
    public DebitAccMessage(decimal amount) 
    { 
     Amount = amount; 
    } 
    public decimal Amount { get; private set; } 
} 

}

Antwort

0

Es funktioniert, weil unter der Haube, Ask eine Schauspieler-Instanz erstellt, die nur verwendet wird, eine einzelne Nachricht, die erwartete Antwort zu erhalten.

+0

Auf welche Art von Akteursinstanz beziehen Sie sich hier? –

+0

@AmalShalika Ich weiß nicht über .net, aber in Scala ist es 'PromiseActorRef', Sie sollten sich die Quellen anschauen, um herauszufinden! Es tut nie weh, die Quellen zu betrachten ... –