2010-11-28 63 views
1

嗨 我在导入方案例如一些问题: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结尾所以一.. 对不起,我的英语不好。

回答

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

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

+2

+1,但没有必要显式调用容器来使用元数据。您只需导入IEnumerable >`。 – 2010-11-28 11:27:52