Polimorfizm w strukturze Reliable Actors
Struktura Reliable Actors umożliwia tworzenie aktorów przy użyciu wielu tych samych technik, których można użyć w projekcie zorientowanym obiektowo. Jedną z tych technik jest polimorfizm, który umożliwia dziedziczenie typów i interfejsów z bardziej uogólnionych elementów nadrzędnych. Dziedziczenie w strukturze Reliable Actors zwykle jest zgodne z modelem platformy .NET z kilkoma dodatkowymi ograniczeniami. W przypadku języka Java/Linux jest zgodny z modelem Java.
Interfejsy
Struktura Reliable Actors wymaga zdefiniowania co najmniej jednego interfejsu, który ma zostać zaimplementowany przez typ aktora. Ten interfejs służy do generowania klasy serwera proxy, która może być używana przez klientów do komunikowania się z aktorami. Interfejsy mogą dziedziczyć z innych interfejsów, o ile każdy interfejs implementowany przez typ aktora i wszystkie jego elementy nadrzędne ostatecznie pochodzą z interfejsu IActor(C#) lub aktora (Java). IActor(C#) i Actor(Java) to odpowiednio zdefiniowane przez platformę interfejsy podstawowe dla aktorów platformy .NET i Java. W związku z tym klasyczny przykład polimorfizmu przy użyciu kształtów może wyglądać mniej więcej tak:
Typy
Można również utworzyć hierarchię typów aktorów, które pochodzą z podstawowej klasy aktora udostępnianej przez platformę. W przypadku kształtów może być typ podstawowy Shape
(C#) lub ShapeImpl
(Java):
public abstract class Shape : Actor, IShape
{
public abstract Task<int> GetVerticeCount();
public abstract Task<double> GetAreaAsync();
}
public abstract class ShapeImpl extends FabricActor implements Shape
{
public abstract CompletableFuture<int> getVerticeCount();
public abstract CompletableFuture<double> getAreaAsync();
}
Podtypy Shape
(C#) lub ShapeImpl
(Java) mogą zastąpić metody z bazy.
[ActorService(Name = "Circle")]
[StatePersistence(StatePersistence.Persisted)]
public class Circle : Shape, ICircle
{
public override Task<int> GetVerticeCount()
{
return Task.FromResult(0);
}
public override async Task<double> GetAreaAsync()
{
CircleState state = await this.StateManager.GetStateAsync<CircleState>("circle");
return Math.PI *
state.Radius *
state.Radius;
}
}
@ActorServiceAttribute(name = "Circle")
@StatePersistenceAttribute(statePersistence = StatePersistence.Persisted)
public class Circle extends ShapeImpl implements Circle
{
@Override
public CompletableFuture<Integer> getVerticeCount()
{
return CompletableFuture.completedFuture(0);
}
@Override
public CompletableFuture<Double> getAreaAsync()
{
return (this.stateManager().getStateAsync<CircleState>("circle").thenApply(state->{
return Math.PI * state.radius * state.radius;
}));
}
}
Zanotuj ActorService
atrybut typu aktora. Ten atrybut informuje platformę Reliable Actors, że powinna automatycznie utworzyć usługę dla podmiotów hostujących tego typu. W niektórych przypadkach możesz utworzyć typ podstawowy przeznaczony wyłącznie do udostępniania funkcji z podtypami i nigdy nie będzie używany do tworzenia wystąpień konkretnych aktorów. W takich przypadkach należy użyć słowa kluczowego abstract
, aby wskazać, że nigdy nie utworzysz aktora na podstawie tego typu.
Następne kroki
- Zobacz , jak platforma Reliable Actors korzysta z platformy Service Fabric, aby zapewnić niezawodność, skalowalność i spójny stan.
- Dowiedz się więcej o cyklu życia aktora.