您好 我在导入方案示例中遇到了一些问题:
[Export(typeof(IICon))]
public class WriteInputData : IICon
{
[Import(typeof(IIOWriter))]
public IIOWriter IOWriter { get; set; }
public object Input { get; set; }
public void Process()
{
IOWriter.Write(Input);
}
}
然后我有两个实现接口IIOWriter的类,如:
[Export(typeof(IIOWriter))]
public class FileWriter : IIOWriter
{
public string FilePath { get; set; }
public void Write(object data)
{
if (string.IsNullOrEmpty(FilePath))
FilePath = @"c:\test.txt";
var fl = new StreamWriter(FilePath, true);
fl.Write((string)data);
fl.Flush();
fl.Close();
}
public string Name
{
get { return "FileWriter"; }
}
}
[Export(typeof(IIOWriter))]
public class ConsoleWrite : IIOWriter
{
public void Write(object data)
{
Console.WriteLine((string)data);
}
public string Name
{
get { return "ConsoleWrite"; }
}
}
我如何让用户这样他可以在运行时更改它,所以他在ListBox FileWriter中键入选择的例子比WriteInputData中的IIOWriter将注入FileWriter结束那样一个.. 抱歉我的英语不好。
答案 0 :(得分:2)
您可能需要向导出提供一些元数据,例如:
[Export(typeof(IIOWriter)),
ExportMetadata("Name", "ConsoleWriter")]
public class ConsoleWriter : IIOWriter
{
}
您需要这样做的原因是您需要提前知道用户选择将匹配的内容。因此,您可能希望重构您的设计以消除对IOWriter
属性的依赖:
[Export(typeof(IICon))]
public class WriteInputData : IICon
{
public object Input { get; set; }
public void Process(IIOWriter writer)
{
}
}
如果您定义要在实例中使用的Process
方法,我们可以使用CompositionContainer
解决此问题。首先,定义与ExportMetadata
值匹配的元数据接口:
public interface INamedMetadata
{
string Name { get; }
}
然后,我们可以解决该实例:
public IIOWriter GetWriter(string name)
{
return container
.GetExports<IIOWriter, INamedMetadata>()
.Where(e => e.Metadata.Name.Equals(name, StringComparison.OrdinalIgnoreCase))
.Select(e => e.Value)
.FirstOrDefault();
}
希望指出你正确的方向......