MEF导入场景

时间:2010-11-28 10:15:37

标签: c# .net mef

您好 我在导入方案示例中遇到了一些问题:

 [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结束那样一个.. 抱歉我的英语不好。

1 个答案:

答案 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();
}

希望指出你正确的方向......