我有以下内容:
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 执行此操作的尝试没有成功。