2017-08-21 3 views
0

私はhttps://aspnetboilerplate.com/Pages/Documents/EventBus-Domain-Eventsを読んでも、私は私の問題の解決策を見つけようと仕事で8時間を費やしているhttps://github.com/aspnetboilerplate/aspnetboilerplate/tree/f10fa5205c780bcc27adfe38aaae631f412eb7df/src/Abp/Events/Bus/Entities汎用のIEventHandlerはどのようにしてビルドできますか?

エンティティイベントハンドラのABPの実装が、私は成功しませんでした。

私は、次のような異なる状態を生成する特定のアクション、記録DatumStatusと呼ばれる単一のエンティティを指し、特定のエンティティ持っている:私はジェネリックを生成しようとしている等の承認を受け、修正、見直し、アーカイブを、

をこれらのアクションに基づいてステータスを変更できるEventHandler。

アルゴリズムに基づい例:

EventBus.Trigger(new ApproveEventData{ 
    Repository = _certainRepository, 
    Ids = [1, 4, 5] 
}); 

ハンドラ自体は、今度は、この状態遷移

public void HandleEvent(ApproveEventData eventData) 
{ 
    eventData.Repository.Where(p => p.Id.IsIn(eventData.Ids)).ForEach(p => { 
     p.Approved = true; 
     p.ApprovalDate = DateTime.Now() 
    }); 
} 

を扱うという問題は、私は、一般的なApproveEventDataとハンドラを記述する必要があり、単一のエンティティごとに同じHandleEventを発生させることができます。私が得た

"最も近い" です:

EventBus.Trigger(typeof(ApproveEventData<int>), (IEventData) new ApproveEventData<int> { 
    Repository = (IRepository<EntityWithStatus<int>, int>) _entityRepository, 
    Ids = selectedIds 
}); 

[Serializable] 
public class ApproveEventData<TPrimaryKey> : EventData 
{ 
    public IRepository<EntityWithStatus<TPrimaryKey>, TPrimaryKey> Repository; 
    public TPrimaryKey[] Ids; 
} 

failes上記の実装リポジトリをキャストするとき。

誰かに光を当てることはできますか?ありがとう!

答えて

2

2つの可能な方法があります。

  1. 共分散および反分散に依存する。 EntityWithStatusのインターフェイスをインターフェイスにし、IEntityWithStatusとIRepositoryの両方を共変(ジェネリック型の定義に追加)することで、キャストを成功させることができます。

  2. ダイナミックに依存し、ジェネリック型の推論を利用します。基本的にリポジトリを動的にする。

私は数1

+0

ホリー****をお勧めします。 #1は働いた。 私はあなたを愛しています –

+0

うれしいです。それがすべての場合は合格として市場に入れてください – Jeff

+0

私は4分以内に受け入れることができます。心配しないで、私はそれをやります。 –

関連する問題