Надежный актер с несколькими интерфейсами?

Есть ли способ создать актера с двумя интерфейсами? Я хочу определить общедоступный интерфейс в сборке интерфейсов и внутренний интерфейс в сборке актера. Причина в том, чтобы разделить методы, которые должны использовать клиенты, и методы, которые должна использовать система.

Например:

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

Похоже, это невозможно, потому что атрибут ActorService допускает только одно имя.

Есть ли лучший способ (который работает) разделить общедоступные и внутренние методы?


person Eli Pulsifer    schedule 06.10.2016    source источник


Ответы (3)


При наличии нескольких интерфейсов среда выполнения не может сгенерировать для службы имя по умолчанию. Вам необходимо применить https://msdn.microsoft.com/en-us/library/azure/microsoft.servicefabric.actors.runtime.actorserviceattribute.aspx

[ActorService(Name="MyActorService")] к вашей реализации актера. Затем вы можете создать прокси-сервер субъекта с этим именем службы, используя https://msdn.microsoft.com/en-us/library/azure/mt694503.aspx.

person VipulM-MSFT    schedule 20.10.2016

Я считаю, что вы можете добиться этого, облегчив полиморфизм в рамках Reliable Actors:

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

Другой способ разделения, который приходит на ум, — разбить общедоступную и внутреннюю функциональность на большее количество участников.

person Rotem Varon    schedule 07.10.2016
comment
Это хорошая статья, но в ней не объясняется, как получить доступ к определенному интерфейсу. Если я что-то не пропустил... - person Eli Pulsifer; 07.10.2016
comment
@EliPulsifer В статье интерфейс используется для создания прокси-класса, который может использоваться клиентами для связи с вашими актерами, что означает, что вы можете создать с помощью ActorProxy. Создайте желаемый интерфейс (общедоступный или внутренний) - person Rotem Varon; 07.10.2016
comment
Я тоже так думал, но у каждого конкретного типа актера есть один служебный Uri. При наличии двух интерфейсов, производных от IActor на верхнем уровне, возникает ошибка времени компиляции, требующая использования атрибута ActorService для определения одного имени службы, которое будет использоваться в Uri службы. Вызов ActorService.Create генерирует Uri из типа интерфейса и будет работать только с одним интерфейсом. - person Eli Pulsifer; 07.10.2016

Я нашел ответ с небольшим экспериментом.

Вы можете использовать любой интерфейс, который вы хотите, если serviceUri, указанный в вызове ActorProxy.Create, является Uri для актера. Итак, для моего примера выше следующий код предоставит доступ к интерфейсу IInternalInterface.

ActorProxy.Create<IInternalInterface>(actorId, ActorNameFormat.GetFabricServiceUri(typeof(IPublicInterface)));
person Eli Pulsifer    schedule 07.10.2016