Это нормально, чтобы вернуть прокси актера из службы

У меня есть какой-то сервис, который принимает некоторые данные, а затем, как мне кажется, должен возвращать актер, инициализированный с некоторыми значениями.

public class MyService : StatefulService, IMyService
{
    public IMyActor DoThings(Data data)
    {
        var actor = ActorProxy.Create<IMyActor>(new ActorId(Guid.NewGuid()));  
        actor.Init(data);
        //some other things
        return actor;
    }
}

Другой сервис сделает это:

var service = ServiceProxy.Create<ICommandBrokerService>(new Uri("fabric:/App"), ServicePartitionKey.Singleton);
var actor = service.DoThings(data);
var state = actor.GetState();
//...

Итак, это нормально, чтобы вернуть актера таким образом, или я должен вернуть идентификатор актера и запросить прокси на вызове?

UPD: Согласно ответу @LoekD, я сделал обертку, чтобы немного повысить безопасность типов.

[DataContract(Name = "ActorReferenceOf{0}Wrapper")]
public class ActorReferenceWrapper<T>
{
    [DataMember]
    public ActorReference ActorReference { get; private set; }
    public ActorReferenceWrapper(ActorReference actorRef)
    {
        ActorReference = actorRef ?? throw new ArgumentNullException();
    }

    public T Bind()
    {
        return (T)ActorReference.Bind(typeof(T));
    }

    public IActorService GetActorService(IActorProxyFactory serviceProxy=null)
    {
        return ActorReference.GetActorService(serviceProxy);
    }

    public TService GetActorService<TService>(IActorProxyFactory serviceProxyFactory) where TService : IActorService
    {
       return serviceProxyFactory.CreateActorServiceProxy<TService>(ActorReference.ServiceUri,
                ActorReference.ActorId);
    }

    public static implicit operator ActorReference(ActorReferenceWrapper<T> actorRef)
    {
        return actorRef.ActorReference;
    }

    public static explicit operator ActorReferenceWrapper<T>(ActorReference actorReference)
    {
        return new ActorReferenceWrapper<T>(actorReference);
    }
}

1 ответ

Решение

Нет, типы, используемые в удаленном взаимодействии SF, должны быть DataContractSerializable, Контракты, которые вы используете, могут иметь только поля и свойства, а не методы.

Таким образом, вместо того, чтобы вернуть прокси, верните ссылку на актера.

Затем используйте Bind для создания прокси из него.

Другие вопросы по тегам