2016-04-29 45 views
3

いくつかの異なるデータオブジェクトに関して同じ種類の動作(CRUD)を持つ複数の異なるアクタータイプがあるアプリケーションを構築しています。これを処理するコードをより簡単に作成するために、これらのアクターが実装できるインターフェースを作成しようとしました。サービスファブリックアクター複数のインターフェイスを実装するインターフェイス

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

IDataActor<T>は次のようになります:

この

は私がこのような何かに見える俳優・インターフェースを持っていることを意味し

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

と俳優のそれの自己は、この

のように見えます
class MyActor1: Actor, IMyActor1 
{ 
    ... 
} 

元私はIDataActor<T>から派生しましたIActor、これは許可されていませんが、わかりやすく "Generic interfaces can not remoted"と表示されます。私が展開しようとするとエラーが発生したので、私はこれを試しました。

私は今、プロジェクトをビルドするとき、私は、次のエラーログを取得:

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) 

エラーは、MyActor1はどんな俳優インタフェースを実装していないと主張しているが、それははっきりしません。これはバグか、実用的な回避策があれば誰でも知っていますか?この作業をすることで、重複したコードをたくさん保存することができます。

ありがとうございます!

+0

私はこの問題に直面しましたが、インタフェースを継承することによって実際には何のメリットも得られていないことに気付きました。私の提案は、あなたのインターフェースとクラスを非アクターのタイプに抽出し、それらを使用することです。ちょうど私の2セント。 –

+0

これは大きな欠陥/見落としのようです。私は文字通り、この同じ質問をしました。 – Tony

答えて

1

サービスファブリックは現在、汎用サービス/アクターインターフェイスをサポートしていません。 2番目のエラーは、IActor(たとえば、IDataActor<T>など)を継承しないインターフェイスを継承するインターフェイスも除外されるためです。エラーメッセージがそこで改善される可能性があります。

サービスのこの制限を回避するには、私はCastle DynamicProxyを使用しました。(コードは長すぎますし、SOの回答には複雑すぎます;時間がたつとブログ投稿に書き込むかもしれません)。

しかし、私は、アクターが単なるデータ以上のものをカプセル化する必要があると考えていると思います。 の動作を表す操作を公開する必要があります。さもなければ、それはおそらく高結合、劣化した保守性、繰り返しコード等をもたらすであろう。これはマイクロサービスの目的を害するものである。

+0

シニアマイクロソフトエンジニアからこの回答でサポートされている回答。 http://stackoverflow.com/questions/36985580/service-fabric-with-generic-services/36992513 – Tony

+0

アクターはデータを格納する以上のことを行いますが、これは簡単なシナリオです。しかし、ありがとう、私はトニーの質問と答えを読んで、私は他の何かを考えなければならないようだ。 –

関連する問題