Pergunta

Eu tenho tentado usar o modelo de provedor configurável para lidar com os meus importações MEF e exportações de MEF Contrib ( link ). Eu li a documentação Codeplex e post do Código Junkie ( link); no entanto, eu não consigo obter o recipiente para criar as peças. Onde estou indo errado?

Program.cs

namespace MEFTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Run();
        }

        // [ImportMany("command", typeof(IHelp))]
        public IEnumerable<IHelp> Commands { get; set; }

        void Run()
        {
            Compose();

            foreach(IHelp cmd in Commands)
            {
                Console.WriteLine(cmd.HelpText);
            }

            Console.ReadKey();
        }

        void Compose()
        {
            var provider = new ConfigurableDefinitionProvider("mef.configuration");
            var catalog = new DefinitionProviderPartCatalog<ConfigurableDefinitionProvider>(provider);
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);
        }
 }
}

TestCommand.cs

namespace MEFTest
{
    //[Export("command", typeof(IHelp))]
    public class TestCommand : IHelp
    {
        private string _helpText = "This is a test.";

        public string CommandName
        {
            get { return "Test"; }
        }

        public string HelpText
        {
            get { return _helpText; }
        }
    }
}

seção App.Config:

<mef.configuration>
 <parts>
  <part type="MEFTest.TestCommand, MEFTest">
   <exports>
    <export contract="IHelp" />
   </exports>
  </part>
  <part type="MEFTest.Program, MEFTest">
   <imports>
    <import member="Commands" contract="IHelp" />
   </imports>
  </part>
 </parts>
</mef.configuration>

Eu não obter quaisquer erros de compilação e ele funciona muito bem se eu mudar para o sistema típico à base de atributo que faz parte do núcleo MEF (com o catálogo apropriado também). Program.Commands é sempre nulo no exemplo acima. Eu tentei usar apenas uma propriedade singular em vez de uma coleção e obter os mesmos resultados.

Quando eu depurar posso obter a coleção provider.Parts então eu sei que está acessando as informações de configuração corretamente; no entanto, eu recebo um InvalidOperationException quando eu depurar e tentar furar catalog.Parts.

Alguém tem alguma experiência a respeito de onde eu estou indo errado aqui?

Foi útil?

Solução

Como documentado aqui , você também precisa isso em seu arquivo de configuração:

<configSections>
  <section
    name="mef.configuration"
    type="MefContrib.Models.Provider.Definitions.Configurable.PartCatalogConfigurationSection, MefContrib.Models.Provider" />
</configSections>

Se você já tem isso, então pode ser interessante para nos mostrar o rastreamento de pilha do InvalidOperationException que você recebe ao acessar provider.Parts.

Outras dicas

Eu tive os mesmos problemas e não poderia obtê-lo a trabalhar, mas aqui estão alguns detalhes: Parece que ComposeParts () não funciona como esperado (pelo menos na versão que eu usei) porque usa métodos estáticos, baseada na reflexão para encontrar todas as importações necessárias (assim parece que esta parte não pode ser alterado a partir do exterior do MEF). Infelizmente nós queremos usar a configuração XML e não atribui o MEF.

Ele funciona se você adicionar [Import] atribui aos membros da classe que você usa com ComposeParts (). No seu caso, isso seria "Programm". Neste caso, todas as exportações definidas no arquivo de configuração será encontrado.

Eu não poderia encontrar qualquer documentação ou exemplos na página MEF Contrib relativas a esse problema. Também não há unittest na projekt MEF contrib que usa ComposeParts (). Uma solução alternativa seria usar container.GetExportedValues ??() para recuperar os valores, mas neste caso você tem que definir os membros aulas manualmente.

Espero que ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top