2016-04-29 2 views
3

Ich erstelle eine Anwendung, in der ich mehrere verschiedene Akteurentypen mit der gleichen Art von Verhalten (CRUD) in Bezug auf einige verschiedene Datenobjekte habe. Um einfacher Code zu erstellen, der das handhabt, habe ich versucht, eine Schnittstelle zu erstellen, die diese Akteure implementieren können.Service Fabric Actor-Schnittstellen, die mehrere Schnittstellen implementieren

Das bedeutet, dass ich ein Schauspieler-Schnittstelle haben, die etwa wie folgt aussieht:

public interface IMyActor1 : 
    IActor, 
    IDataActor<DataItem1>, 
    IDataActor<DataItem2> 

Wo die IDataActor<T> wie folgt aussieht:

public interface IDataActor<T> where T : IDataItem 
{ 
    Task Create(T item); 
    Task<T> Read(string itemId); 
    Task Update(T item); 
    Task Delete(string itemId); 
} 

Und der Schauspieler es selbst sieht aus wie dieses

class MyActor1: Actor, IMyActor1 
{ 
    ... 
} 

Ursprünglich versuchte ich IDataActor<T> vonabzuleiten, aber verständlicherweise ist dies nicht erlaubt, und ich bekomme eine "Generische Schnittstellen können nicht entfernt werden." Fehler, wenn ich versuche, zu implementieren, also habe ich das versucht.

Als ich das Projekt jetzt bauen bekomme ich folgende Fehlerprotokoll:

System.ArgumentException: The actor type 'MyProject.ActorProject.MyActor1' does not implement any actor interfaces. An actor interface is the one that derives from 'Microsoft.ServiceFabric.Actors.IActor' type. 
    Parameter name: actorType 
    at Microsoft.ServiceFabric.Actors.Runtime.ActorTypeInformation.Get(Type actorType) 
    at FabActUtil.Tool.LoadActors(Assembly inputAssembly, IList`1 actorFilters, IList`1 actorTypes) 
    at FabActUtil.Tool.LoadActors(ToolContext context) 
    at FabActUtil.Tool.ProcessInput(ToolContext context) 
    at FabActUtil.Tool.Run(ToolArguments arguments) 
    at FabActUtil.Program.Main(String[] args) 

Der Fehler behauptet, dass MyActor1 implementieren keine Schauspieler Schnittstellen, aber es ist eindeutig der Fall ist. Weiß jemand, dass dies ein Fehler ist, oder wenn es einen praktischen Workaround gibt? Wenn ich das funktioniere, könnte ich viel doppelten Code sparen.

Danke!

+0

Ich selbst lief auf dieses Problem, aber dann erkannte ich, dass ich nicht wirklich einen Vorteil durch die Schnittstelle Vererbung bekam. Mein Vorschlag wäre, Ihre Schnittstellen und Klassen in Nicht-Akteur-Typen zu extrahieren und diese zu verwenden. Nur meine zwei Cent. –

+0

Dies scheint ein großer Fehler/Aufsicht zu sein. Ich habe diese Frage buchstäblich gestellt. – Tony

Antwort

1

Service Fabric unterstützt derzeit keine generischen Service/Actor-Schnittstellen. Der zweite Fehler, den Sie sehen, besteht darin, dass er auch Schnittstellen ausfiltert, die von Schnittstellen erben, die nicht von IActor erben (z. B. IDataActor<T>). Die Fehlermeldung könnte dort verbessert werden.

Um diese Einschränkung für Dienste zu umgehen, habe ich Castle DynamicProxy verwendet (der Code ist zu lang und komplex für eine SO-Antwort;

Das heißt, ich denke, dass Sie vielleicht in Betracht ziehen sollten, dass Akteure mehr als nur Daten kapseln sollten. Sie sollten Vorgänge anzeigen, die Verhalten darstellen. Andernfalls würde dies höchstwahrscheinlich zu einer hohen Kopplung, verschlechterter Wartbarkeit, wiederholtem Code usw. führen - was den Zweck von Microservices vereitelt.

+0

Antwort von dieser Antwort von einem Senior Microsoft Engineer unterstützt. http://stackoverflow.com/questions/36985580/service-fabric-with-generic-services/36992513 – Tony

+0

Die Akteure speichert mehr als nur Daten, dies ist ein vereinfachtes Szenario. Aber danke, ich lese Tonys Frage und die Antworten, und es scheint, ich muss an etwas anderes denken. –