【问题标题】:Reliable Actor with multiple interfaces?具有多个接口的可靠 Actor?
【发布时间】:2017-02-15 20:31:24
【问题描述】:

有没有办法创建一个有两个接口的actor? 我想在 Interfaces 程序集中定义公共接口,在 actor 程序集中定义内部接口。原因是将客户端应该使用的方法和系统应该使用的方法分开。

例如:

class MyActor
    : Actor
    , IPublicInterface
    , IInternalInterface
{
    ...
}

看起来这是不可能的,因为 ActorService 属性只允许一个名称。

有没有更好的方法(有效)来隔离公共方法和内部方法?

【问题讨论】:

    标签: c# azure-service-fabric service-fabric-actor


    【解决方案1】:

    我相信您可以通过促进 Reliable Actors 框架中的多态性来实现这一点:

    https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-actors-polymorphism/

    想到的另一种隔离方法是将公共和内部功能分解为更多参与者。

    【讨论】:

    • 这篇文章不错,但没有说明如何访问特定界面。除非我错过了什么……
    • @EliPulsifer 在文章“interface is used to generate a proxy class that can be used by clients to communicate with your Actors”这意味着您可以使用 ActorProxy 创建。创建所需的接口(公共或内部)
    • 我也是这么想的,但是每个具体的演员类型都有一个服务 Uri。当您有两个从顶级 IActor 派生的接口时,您会收到一个编译时错误,需要使用 ActorService 属性来定义要在服务 Uri 中使用的一个服务名称。调用 ActorService.Create 会根据接口类型生成 Uri,并且仅适用于单个接口。
    【解决方案2】:

    我通过一些实验找到了答案。

    你可以使用任何你想要的接口,只要在 ActorProxy.Create 调用中指定的 serviceUri 是actor的 Uri。因此,对于我上面的示例,以下代码将提供对 IInternalInterface 的访问权限。

    ActorProxy.Create<IInternalInterface>(actorId, ActorNameFormat.GetFabricServiceUri(typeof(IPublicInterface)));
    

    【讨论】:

      【解决方案3】:

      当您有多个接口时,运行时无法为服务生成默认名称。你需要申请https://msdn.microsoft.com/en-us/library/azure/microsoft.servicefabric.actors.runtime.actorserviceattribute.aspx

      [ActorService(Name="MyActorService")] 到你的actor实现。然后,您可以使用https://msdn.microsoft.com/en-us/library/azure/mt694503.aspx 方法创建具有此服务名称的参与者代理。

      【讨论】:

        猜你喜欢
        • 2017-03-10
        • 2015-12-14
        • 2013-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-04
        相关资源
        最近更新 更多