使用TypeConverters进行依赖注入
本文关键字:依赖 注入 TypeConverters 使用 | 更新日期: 2023-09-27 18:01:54
我有一个应用程序,我正在设计它引用了一个库,我也在设计。具体地说,应用程序需要创建在低级库中定义的Sheathing类的实例。
[TypeConverter(typeof(SheathingOptionsConverter))]
public class Sheathing : Lumber
{
public string Description { get; set; }
public Sheathing(string passedDescription)
{
Description = passedDescription;
}
}
我的应用程序在属性网格中列出了不同的套接选项。因为它在一个下拉菜单中列出了它们,所以我必须扩展ExpandableObjectConverter两次。第一级是我的SheathingObjectConverter,它可以正确显示单个Sheathing对象
public class SheathingObjectConverter : ExpandableObjectConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(Sheathing))
{
return true;
}
return base.CanConvertTo(context, destinationType);
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
}
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, System.Type destinationType)
{
if (destinationType == typeof(System.String) && value is Sheathing)
{
Sheathing s = (Sheathing)value;
return "Description: " + s.Description;
}
return base.ConvertTo(context, culture, value, destinationType);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string)
{
try
{
string description = (string)value;
Sheathing s = new Sheathing(description);
return s;
}
catch
{
throw new ArgumentException("Can not convert '" + (string)value + "' to type Sheathing");
}
}
return base.ConvertFrom(context, culture, value);
}
}
第二层扩展了SheathingObjectConverter,将Sheathing对象列表显示为属性网格中的下拉菜单
public class SheathingOptionsConverter : SheathingObjectConverter
{
/// <summary>
/// Override the GetStandardValuesSupported method and return true to indicate that this object supports a standard set of values that can be picked from a list
/// </summary>
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
/// <summary>
/// Override the GetStandardValues method and return a StandardValuesCollection filled with your standard values
/// </summary>
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
List<Sheathing> sheathingDescriptions = SettingsController.AvailableSheathings; //ToDo: Fix needing a list from the application (higher level)
return new StandardValuesCollection(sheathingDescriptions.ToArray());
}
}
问题就在这里;上面的所有代码都在我的低级库中,但SettingsController是我的高级应用程序中的一个类,因为这是定义套套列表的地方。通常情况下,这个问题可以通过依赖注入来解决,但因为这涉及类型转换,所以我不确定是否可以使用依赖注入。我不知道如何解决这个问题
context
参数是预期的注入点。
创建一个这样的类:
class SheathingContext : ITypeDescriptorContext
{
public List<Sheathing> AvailableSheathings
{
get { return SettingsController.AvailableSheathings; }
}
}
然后将其作为context
传递给类型转换器。在类型转换器中,您可以为列表使用((SheathingContext)context).AvailableSheathings
。