的注入變化實現服務定位器我有以下幾點:與泛型類型
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尚未成功。