2017-11-30 7 views
0

メディエータリクエストのインスタンスを取得しようとしていますが、IoCを使用すると実行可能であると考えました。シンプルインジェクタで名前で知られている登録を取得する

を考えると、次の登録:

container.Register(typeof(IRequest<>), assemblies); 
container.Register(typeof(IRequestHandler<,>), assemblies); 

、次のクラス名"SubtractRequest"てインスタンスを解決するための最良の方法は何

public class SubtractRequest: IRequest<int> 
{ 
    public int Left { get; set; } 
    public int Right{ get; set; } 

    public SubtractRequest() { } 

    internal class Handler : IRequestHandler<SubtractRequest, int> 
    { 
     public Handler() {} 

     public string Handle(SubtractRequest request) 
     { 
      return request.Left - request.Right; 
     } 
    } 
} 

このようなJSON-RPCオブジェクトを取得するには、{"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}というメソッドを抽出し、そのメソッド名でそのメディエータリクエストのインスタンスを取得します。

var request = JsonConvert.DeserializeObject<JsonRpcRequest>(jsonRpcRequest); 
var mediatorRequest = GetRequestByName($"{request.Method}Request"); //Via IoC? 
//SetParams(mediatorRequest) [todo] 
var result = mediator.Send(mediatorRequest).Result; 

基本的に私は正しいメディエーター要求を得るために、私GetRequestByName()メソッドを実装する方法を最もよく動作するようにしようとしています。非常に広範な問題だと答えは、あなたが使用しているフレームワークに依存し、どのようにこのデータがで来ているが、一般的に、あなたがする必要があります

答えて

2

  • は、特定のIRequest<TResponse>に着信要求を関連付けますメッセージ。
  • そのリクエストメッセージタイプからTResponseタイプを抽出します。
  • 着信要求を要求タイプに非直列化します。
  • リクエストタイプとTResponseタイプに基づいてクローズドジェネリックIRequestHandler<TRequest, TResponse>バージョンを作成します。
  • 解決済みIRequestHandler<TRequest, TResponse>Containerです。
  • ハンドラのHandleメソッドを呼び出します。

GithubにSOLID Servicesと呼ばれる参照アーキテクチャアプリケーションがあり、その方法の例が含まれています。特に、Web APIプロジェクトのQueryDelegatingHandlerの実装を見てください。基本的にはあなたが必要とすることを実行するからです。完成したプロジェクトをダウンロードして遊んでも構いませんが、インターフェイスの名前は少し違っています。 IRequest<TResponse>IRequestHandler<TRequest, TResponse>を呼び出す場合、サンプルプロジェクトはIQuery<TResult>IQueryHandler<TQuery, TResult>を呼び出します。しかし、アイデアは同じです。

一つ最後のノートでは、以下の登録を削除してください:

container.Register(typeof(IRequest<>), assemblies); 

IRequest<TResponse>がメッセージの定義です。メッセージはDTOであり、それらを作成することはDIコンテナの懸案事項ではありません。それらをコンテナに登録すると、コンテナの構成を正常に検証できなくなる可能性があります。あなたが登録すべき唯一のものはIRequestHandler<,>です。

UPDATE

これはあなたのコードがどのように見えるべきか、基本的である:

Type requestType = GetRequestTypeByName($"{request.Method}Request"); 

dynamic request = JsonConvert.DeserializeObject(requestType, jsonRpcRequest); 

object result = ((dynamic)mediator).Send(request).Result; 

あなたはGetRequestTypeByNameを実装する必要があります。これはではなく、012コンテナが手助けできるものがです。リフレクションを使用してアセンブリ内の型を調べ、タイプが{request.Method}Requestであることを確認してください。

+0

多くのお返事ありがとうございます、なぜ私は私がやっていることをやりたかったのか説明したとは思いません。私は私の質問に追加情報を追加しましたが、私はこの優れた答えを無関係にしてしまったのではないかと心配しています。 – 4imble

+0

私は 'mediator.Send(...) 'を呼び出すとすべてのリクエストを取得して処理するためにメディエーションライブラリ(Mediatr)を使用していますが、これはすべてIoCでうまくいきます(SubtractRequestを新しくしてテストしました。それを送信し、正しい結果を得る)。私の問題は、自分自身を新しくするのではなく、文字列名を取って、この名前で '{name} Request'を見つけて作成し、それを送信してハンドラがそのことをできるようにしたいのです。私は、単純な反射を使用すべきところであるIoCで非常にばかげたことをやろうとしていると思います。混乱のために申し訳ありませんが、助けてくれてありがとう。 – 4imble

+0

私の答えは同じです。受信したデータを適切なリクエストに逆シリアル化してMediatRに渡す必要があります。これはあなたのDIコンテナではほとんどありません。それはちょうどあなたがしなければならないことです。 – Steven

関連する問題