Azure Service Fabric(预览版)Actors SDK 为 Actor 继承提供了惊人的行为

Azure Service Fabric (Preview) Actors SDK provides astonishing behavior for Actor inheritance

在尝试使用预览版 SDK 后,我在尝试为我正在开发的框架使用的一组相关 Actor 类型提供通用实现时注意到一些令人惊讶的事情。

创建如下代码似乎没有按预期工作:

图书馆:

public abstract class CommonActor : Actor, ICommonActor
{
    public abstract void DoStuff();
}

控制台应用程序:

public class MyActor : CommonActor
{
   public void override DoStuff()
   {
      //Stuff
   } 
}

创建 Actor 时,注册 Actor 的调用失败。

fabricRuntime.RegisterActor(typeof(MyActor)); 

我收到一个错误,指出类型不是从 Actor 派生的,这显然是伪造的。

我还注意到这似乎破坏了生成服务清单的工具。 (我不得不通过禁用该工具来解决这个问题。)

这基本上阻止了我以我想要的方式为我的用户编写 API。我一点也不喜欢那样。与其他人报告的类似,这里几乎没有对依赖注入场景的支持,这对我来说极大地破坏了 Actors 模型的实用性。

我错过了什么吗?这里有更好的方法来实现 actor 抽象吗?

感谢您报告问题。这是一个已知的限制,将在未来的版本中得到修复。虽然不漂亮,但您可以通过使用遏制来解决。

只要使用 ActorService 装饰器明确命名子演员,现在就可以完成此操作。在您的示例中,这将转换为像这样更新 MyActor class...

    [ActorService(Name = "MyActor")]      // Child actors need this decorator
    public class MyActor : CommonActor
    {
        public void override DoStuff()
        {
            //Stuff
        }
    }

Service Fabric documentation 中还提供了更多信息。