2012-11-21 3 views
0

어쩌면 나 자신에게 너무 힘들지만 실제로 이것을 알고 싶습니다. MEF를 사용하고 내 인생을 단순하게 만들 수 있다고 생각했기 때문에 나는 정말 못된 생성자가 하나 있습니다. 그러나 나는 옳지 않았습니다. 나는 정말로 Google을 사용했지만, 내가 발견 한 모든 것은 이것과 비교할만한 것이 아니었다. generic 형식의 인스턴스 두 개를 내보내는 중

new BussinesProcessLoader(new Loader<List<Resource>>(new Projects.Deserializer.ResourceDeserializer(), fileResolver), new Loader<List<Project>>(new ProjectsDeserializer(), fileResolver)) 

그래서 나는 두 가지를 내보낼 수 아니다 발견 :

public BussinesProcessLoader(ILoader<List<Resource>> resourceLoader, ILoader<List<Project>> projectsLoader) 
{ 
    this.resourceLoader = resourceLoader; 
    this.projectsLoader = projectsLoader; 
} 

가 지금은 MEF를 사용하고이 같은 BussinesProcessLoader를 작성할 수 있도록하려면 :

나는 이런 생성자가 이 클래스의 인스턴스는 다음과 같습니다.

internal class Loader<T> : ILoader<T> 
{ 
    public Loader(IDeserializer<T> deserializer, FileResolver fileResolver) 
    { 
     this.Deserializer = deserializer; 
     this.FileResolver = fileResolver; 
    } 

    public IDeserializer<T> Deserializer { get; set; } 

    public FileResolver FileResolver { get; set; } 

    ... 
} 

두 개의 다른 ImportingConstructor attri가 필요합니다. butes 및 contractName 두 개의 수출 ...

...이 같은 BussinesProcessLoader의 생성자를 수정 :

[ImportingConstructor] 
public BussinesProcessLoader([Import("ResourceLoader")] ILoader<List<Resource>> resourceLoader, [Import("ProjectsLoader")] ILoader<List<Project>> projectsLoader) 
{ 
    this.resourceLoader = resourceLoader; 
    this.projectsLoader = projectsLoader; 
} 

이를 위해도 가능합니까? 어떤 도움을 주시면 감사하겠습니다.

답변

1

나는 당신이 당신의 수출에 대한 두 개의 서로 다른 구체적인 클래스를 필요할 것 같은데요 :

[Export(typeof(ILoader<List<Resource>>))] 
internal class ResourceLoader : Loader<List<Resource>> 
{ 
    [ImportingConstructor] 
    public ResourceLoader(IDeserializer<List<Resource>> deserializer, FileResolver fileResolver) : base(deserializer, fileResolver) 
    { 
    } 
} 

[Export(typeof(ILoader<List<Project>>))] 
internal class ProjectLoader : Loader<List<Project>> 
{ 
    [ImportingConstructor] 
    public ProjectLoader(IDeserializer<List<Project>> deserializer, FileResolver fileResolver) : base(deserializer, fileResolver) 
    { 
    } 
} 

당신은 당신의 BussinesProcessLoader 생성자에 [ImportingConstructor] 속성을 추가해야합니다,하지만 당신은에 [Import("...")] 속성이 필요하지 않습니다 매개 변수.

+0

와우, 너무 간단하고 훌륭한 솔루션입니다. 그렇게 생각하지 않은 것은 수치스러운 일입니다. 감사합니다. –

관련 문제