私は次のものを持っています:
public interface IConverter<TValue, TConverted>
{
}
public interface IConverterProvider
{
IConverter<TValue, TConverted> GetConverter<TValue, TConverted>();
}
セットアップ時のバインディングの例:
Bind<IConverter<System.Int32, System.String>>().To<Int32ToStringConverter>();
Bind<IConverter<System.Guid, System.String>>().To<GuidToStringConverter>();
したがって、固定コンバーターのコレクションがあり、重複するバインディングはありません。
[質問] 私の質問は、IConverterProvider を実装し、シングルトンにマップされた利用可能なバインディングの辞書を挿入するにはどうすればよいですか? つまり、実行時のサービス ロケーター パターンを回避する方法です。
現在、毎回 NInject カーネルを使用して解決していますが、これはアンチパターンだと思います。私が欲しいのは次のようなものです:
public class ConverterProvider : IConverterProvider
{
private Dictionary<Type, object> _converters;
public ConverterProvider(Dictionary<Type, object> converters)
{
_converters = converters;
}
public IConverter<TValue, TConverted> GetConverter<TValue, TConverted>()
{
var fullTypeResolve = typeof (IConverter<,>).MakeGenericType(typeof (TValue), typeof (TConverted));
return _converters.Where(x => x.Key == fullTypeResolve).Select(x=>x.Value).Cast<IConverter<TValue, TConverted>>().Single();
}
}
しかし、これには事実上、依存性注入カーネルからすべての IConverter<,> のリストを解決して取得できる必要があり、NInject からこれを行う以前の試みは成功していません。