OKアプリケーションにコマンドオブジェクトをキューに追加するCommand-CommandHandlerパターンを実装しました。 Castle Windsorを介して依存性注入を使用して汎用メソッドとともにコマンドオブジェクトの関連ハンドラを取得します。ジェネリックス経由でインターフェイスの代わりにクラスタイプを渡す
コマンドインタフェースはとても似空白である:CommandHandlerインタフェースは、同じように扱う一方で
public interface ICommand
{
}
:
public interface ICommandHandler<TCommand> where TCommand : ICommand
{
void Handle(TCommand command);
}
これらは、その後、私はキューを介して送信したいコマンドによって実現されています。そして、そのようなDependencyRegistrationラッパーを通じて城ウィンザーに登録:
_dependencyRegister
.AddRegistration<ICommandHandler<TestCommand>, TestCommandHandler>();
だから、キューに追加される各コマンドは、ハンドラと1対1でマッピングします。その後Castle Windsorに登録されます。私たちは、特定のCommandオブジェクトに関連するCommandHandlerを取得するには、このような一般的な方法を使用することができます。
private void HandleCommand<T>(T queueItem) where T: ICommand
{
var handler = _dependencyResolver.Resolve<ICommandHandler<T>>();
handler.Handle(queueItem);
}
最後のピースは、このようになりますキューディスパッチャ方法である:
private void DispatchQueueItem(ICommand queueItem)
{
HandleCommand(queueItem);
}
右。問題は、私がICommandとしてキューからコマンドを取り出し、それをDispatchQueueItemメソッドに渡すときです。 HandleCommandメソッドに送信されるとき、 "T"型は常に "ICommand"インタフェースに設定されます。インターフェイス(DependencyRegistrationサンプルコードのTestCommand)の実際の実装ではなく、
私の質問は、 HandleCommandメソッドを実装のTypeを取得するように設定するにはどうすればよいですか。インターフェイスではない?
私はこの一般的な設定を複製するのに1秒です。私は 'DispatchQueueItem'ボックスが' ICommand'であるので、 'HandleCommand'の包括的な引数はボックス型から推測されていると思います。 – Tejs
(T)汎用構文は、そのタイプのコンパイル時の解決です。実行時の型の解決を探しています。それを判断するには、ダイナミックタイプまたはリフレクションを使用する必要があります。 – user957902