私が直面している問題に似た多くの質問と回答を見つけました。しかし、実用的なソリューションをまとめることができませんでした。
私は次のものを持っています:
public interface IProcessing<V,W> where W: TaskResponse where V: TaskRequest
{
W process(V req);
}
TaskRequest
&はTaskResponse
抽象基底クラスです
また、この具象クラスが定義されています。
public class MathProcessor : IProcessing<MathRequest, MathResponse>
{
public MathResponse process(MathRequest req) {
// do stuff
// create a MathResponse instance
return resp;
}
}
ここでMathRequest
&MathResponse
は派生クラスであり、インターフェイス定義で制約として使用されるそれぞれの抽象クラスです。
インターフェイスに従って具象型を登録し、autofac で解決することは問題ありません。
しかし、実行時に別の型 (この場合は要求オブジェクトなどMathRequest
) に基づいて具象型を解決しようとする意図された使用法では、困難が生じます。これは基本的に、メッセージが受信されて適切なハンドラーにディスパッチされる、一般的に見られるメッセージ ハンドラー パターン (疑似コードが続きます) を実現するためのものです。
TaskRequest req = getNextRequest();
var proc = container.Resolve(req.getType().Name)
proc.process(req);
フォーラムの関連トピックに基づいて、基本的な提案は、ファクトリを定義してコンテナに登録し、実行時にファクトリを使用して、指定されたパラメータに基づいて必要なオブジェクトを作成することです。それは正しいようです。
IIndex<K,V>
autofacの機能を使用して、適切なタイプ/サービスをキーで検索するという関連する提案も見ています。
MathProcessor
キーがタイプであるキーによるタイプの登録と解決に問題があります(この場合はMathRequest
)。エラーは、一般的なインターフェイスの定義と許可されているものに関連している可能性があります。
登録:
builder.RegisterType<MathProcessor>().As<IProcessing<MathRequest, MathResponse>>().Keyed<IProcessing<MathRequest, MathResponse>>(strTypeName);
大丈夫ですが、
builder.RegisterType<MathProcessor>().As<IProcessing<TaskRequest, TaskResponse >>().Keyed<IProcessing< TaskRequest, TaskResponse >>(strTypeName);
ではありません。
注:.Netのジェネリック型とco&contravarianceに関するすべての投稿に基づいて、インターフェイスを次のように変更しました:
public interface IProcessing<in V, out W> where W: TaskResponse where V: TaskRequest
{
W process(V req);
}
しかし、それはよく理解していない単なる推測です。私の素朴な見解では、MathProcessor は IProcessing の一種ですが、そうではないようです。