2010-11-28 2 views
1

안녕 I 가져 오기 시나리오의 예를 몇 가지 문제가 내가 할 수있는 방법MEF 가져 오기 시나리오

[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 특성에 종속성을 제거하기 위해 설계를 리팩토링 할 수 있습니다 :

당신이 인스턴스에 걸릴 당신의 Process 방법을 정의하는 경우
[Export(typeof(IICon))] 
public class WriteInputData : IICon 
{ 
    public object Input { get; set; } 

    public void Process(IIOWriter writer) 
    { 

    } 
} 

, 우리는 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 >'만 가져올 수 있습니다. –

관련 문제