文字列または XML からオブジェクトを逆シリアル化する目的***Converter
で継承する一連のオブジェクトがあります。IConverter
public interface IConverter
{
object Convert(object value, Type targetType);
}
(コンパイル時の型がわからないので、ここではジェネリックを使用できません)。
a を使用し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);
}
}
シリアライゼーション モジュールでコンバーターをバインドするときは、"Converts" の下に型メタデータを添付します。
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);
}
型を解決するときに、特定の型を変換するコンバーターのコンテナーを照会できます。
private IConverter GetConverter(Type t)
{
return converterKernel.Get<IConverter>(metadata => t == metadata.Get<Type>("Converts"));
}
ただし、これは、クラス コンストラクターで IKernel インスタンスを取得し、実行時にクエリを実行する必要があることを意味します。
コンストラクターで単純に要求IEnumerable<IConverter>
し、各コンバーターの型で ConvertsAttribute をクエリすることもできますが、Ninject のメタデータを利用してこれを行う方法があるかどうか疑問に思います...メタデータが添付IEnumerable<IConverter>
されたコンストラクターで を要求できますか? この例では、コンテナ自体にクエリを実行する必要がないことを意味するタイプのディクショナリを構築したいと考えています。IDictionary<Type, IConverter>