メディエータリクエストのインスタンスを取得しようとしていますが、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()メソッドを実装する方法を最もよく動作するようにしようとしています。非常に広範な問題だと答えは、あなたが使用しているフレームワークに依存し、どのようにこのデータがで来ているが、一般的に、あなたがする必要があります
多くのお返事ありがとうございます、なぜ私は私がやっていることをやりたかったのか説明したとは思いません。私は私の質問に追加情報を追加しましたが、私はこの優れた答えを無関係にしてしまったのではないかと心配しています。 – 4imble
私は 'mediator.Send(...) 'を呼び出すとすべてのリクエストを取得して処理するためにメディエーションライブラリ(Mediatr)を使用していますが、これはすべてIoCでうまくいきます(SubtractRequestを新しくしてテストしました。それを送信し、正しい結果を得る)。私の問題は、自分自身を新しくするのではなく、文字列名を取って、この名前で '{name} Request'を見つけて作成し、それを送信してハンドラがそのことをできるようにしたいのです。私は、単純な反射を使用すべきところであるIoCで非常にばかげたことをやろうとしていると思います。混乱のために申し訳ありませんが、助けてくれてありがとう。 – 4imble
私の答えは同じです。受信したデータを適切なリクエストに逆シリアル化してMediatRに渡す必要があります。これはあなたのDIコンテナではほとんどありません。それはちょうどあなたがしなければならないことです。 – Steven