的注入变化实现服务定位器我有以下几点:与泛型类型
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尚未成功。