まず、あいまいな質問タイトルで申し訳ありません。より正確なものを思いつくことができませんでした。
これらのタイプを考えると:
{ TCommand : ICommand }
«interface» «interface» /
+-----------+ +----------------------/----+
| ICommand | | ICommandHandler<TCommand> |
+-----------+ +---------------------------+
^ | Handle(command: TCommand) |
| +---------------------------+
| ^
| |
+------------+ +-------------------+
| FooCommand | | FooCommandHandler |
+------------+ +-------------------+
^
|
+-------------------+
| SpecialFooCommand |
+-------------------+
Dispatch
任意のコマンドを受け入れて適切な .xml ファイルに送信するメソッドを作成したいと思いますICommandHandler<>
。DI コンテナー (Autofac) を使用すると、コマンドの型からコマンド ハンドラーへのマッピングが大幅に簡素化される可能性があると考えました。
void Dispatch<TCommand>(TCommand command) where TCommand : ICommand
{
var handler = autofacContainer.Resolve<ICommandHandler<TCommand>>();
handler.Handle(command);
}
DI コンテナーが上記のすべての型を認識しているとします。今私は呼んでいます:
Dispatch(new SpecialFooCommand(…));
実際には、これは Autofac が をスローする結果になりComponentNotRegisteredException
ますICommandHandler<SpecialFooCommand>
。
SpecialFooCommand
ただし、理想的には、使用可能な最も近いコマンド ハンドラーによってa が処理されるようにしたいと考えています。FooCommandHandler
上記の例のa によって。
おそらくカスタム登録ソースを使用して、Autofacをその目的に合わせてカスタマイズできますか?
PS: (次の例のように) 共分散/反分散が邪魔になるという根本的な問題がある可能性があること、および唯一の解決策はジェネリックをまったく使用しないことである可能性があることを理解しています...しかし、私はそうします可能であれば、ジェネリック型に固執したい。
ICommandHandler<FooCommand> fooHandler = new FooCommandHandler(…);
ICommandHandler<ICommand> handler = fooHandler;
// ^
// doesn't work, types are incompatible