我有一组从IConverter
继承与字符串或XML反序列化对象的目标***Converter
对象:在这种情况下如何避免服务地点? (Ninject)
public interface IConverter
{
object Convert(object value, Type targetType);
}
(我不知道在编译时的类型,以便我能这里不使用泛型)。
我用ConvertsAttribute
标记哪些类型的转换器可以转换,然后双打作为一个Ninject ConstraintAttribute
:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Parameter | AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public class ConvertsAttribute : ConstraintAttribute
{
public Type TargetType { get; private set; }
public ConvertsAttribute(Type t)
{
TargetType = t;
}
public override bool Matches(IBindingMetadata metadata)
{
return metadata.Has("Converts") && metadata.Get<Type>("Converts") == this.TargetType;
}
}
[Converts(typeof(Int32))]
[Converts(typeof(Single))]
[Converts(typeof(String))]
[Converts(typeof(Double))]
public class BasicConverter : IConverter
{
public object Convert(object value, Type targetType)
{
return System.Convert.ChangeType(value, targetType);
}
}
当我系列化模块绑定转换器,我附上类型的元数据在“化” :
private void BindConverter(Type typeInfo)
{
var converterAttributes = typeInfo.GetCustomAttributes(typeof(ConvertsAttribute), true);
foreach (var attribute in converterAttributes.Cast<ConvertsAttribute>())
Bind<IConverter>().To(typeInfo).WithMetadata("Converts", attribute.TargetType);
}
在解析类型,I可以然后查询其将特定类型的转换器中的容器:
private IConverter GetConverter(Type t)
{
return converterKernel.Get<IConverter>(metadata => t == metadata.Get<Type>("Converts"));
}
但是,这意味着我必须在我的类构造函数中取出IKernel实例,并在运行时查询它(我想避免它(我能够查询非IConverter对象的ConverterKernel)。
我可以简单地要求IEnumerable<IConverter>
在构造函数中,然后查询ConvertsAttribute每个转换器的类型,但我不知道是否有驾驭Ninject的为我做这个元数据的方式......我能要求在IEnumerable<IConverter>
我的构造函数附带元数据?在这种情况下,我想构建一个类型为IDictionary<Type, IConverter>
的字典,这意味着我不必查询容器本身。