【问题标题】:Inheritance with Akka.Net actors继承 Akka.Net 演员
【发布时间】:2017-02-15 08:17:41
【问题描述】:

我想知道,如何用 Akka.Net 实现继承。我希望基础actor处理基础消息,子actor处理子消息。

例如,我有以下层次结构:

public class BaseMessage
{
    public string Data { get; set; }
}

public class ChildMessage : BaseMessage
{
    public string ChildData { get ;set; }
}

public abstract class BaseActor : ReceiveActor
{
    private string baseData;

    public BaseActor()
    {
        Receive<BaseMessage>(m => {
            baseData = m.Data;
        });

        // be aware that adding ReceiveAny handler in base class means that you wont be able to add any handlers in descendant actors
        // just override Unhandled method
    }
}

public class MyActor : BaseActor 
{
    private string myData;    

    public MyActor()
    {
        Receive<ChildMessage>(m => {
        myData = m.ChildData;

        // obviously BaseActor won't receive BaseMessage
        // so I should somehow send BaseMessage to it

        // option 1, not sure will it work
        BaseMessage baseMessage = m as BaseMessage;
        Self.Tell(baseMessage);

        // option 2, definitely should work
        BaseMessage baseMessage = new BaseMessage { Data = m.Data };
        Self.Tell(baseMessage);
        });
    }
}

问题是:选项 1 向父 actor 发送消息是否有效?

【问题讨论】:

  • 恕我直言,你为什么不试试呢?!放入一些console.logs,启动一个简单的控制台应用程序并发送消息。
  • @tomliversidge 当然,帖子会在之后更新

标签: c# akka akka.net


【解决方案1】:

不幸的是,它不会以这种方式工作,因为父actor会拦截ChildMessage发送给子actor。所以,我的解决方案如下

public class BaseMessage
{
    public string Data { get; set; }
}

public class ChildMessage : BaseMessage
{
    public string ChildData { get ;set; }
}

public abstract class BaseActor : ReceiveActor
{
    private string baseData;

    public BaseActor()
    {
        Receive<BaseMessage>(m => {
            ProcessMessage(m);
        });

        // be aware that adding ReceiveAny handler in base class means that you wont be able to add any handlers in descendant actors
        // just override Unhandled method instead
    }

    protected virtual void ProcessMessage(BaseMessage m)
    {
        baseData = m.Data;
    }
}


public class MyActor: BaseActor
{
    private string myData;    

    public MyActor()
    {
        // no interceptor for ChildMessage here, because parent class has interceptor for BaseMessage and it will handle ChildMessage too
    }

    protected override void ProcessMessage(BaseMessage m)
    {
        base.ProcessMessage(m);

        // not qute OOP way, but it works
        var childMessage = m as ChildMessage;
        if(childMessage != null)
        {
            myData = childMessage.ChildData;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2014-09-30
    • 1970-01-01
    • 2015-05-10
    • 2015-02-22
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2020-01-03
    • 2017-02-15
    相关资源
    最近更新 更多