문제

MEF 수입 및 MEF Contrib의 수출을 처리하기 위해 구성 가능한 공급자 모델을 사용하려고 노력했습니다.링크). CodePlex 문서와 Code Junkie의 블로그 게시물을 읽었습니다.링크); 그러나 컨테이너가 부품을 만들 수없는 것 같습니다. 내가 어디로 잘못 가고 있습니까?

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

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>

빌드 오류가 발생하지 않으며 MEF 코어의 일부인 일반적인 속성 기반 시스템 (적절한 카탈로그와 함께)으로 전환하면 잘 실행됩니다. 위의 예에서는 프로그램이 항상 무효입니다. 컬렉션 대신 단일 속성을 사용하고 동일한 결과를 얻으려고했습니다.

디버그 할 때 Provider.Parts Collection을 얻을 수 있으므로 구성 정보가 올바르게 액세스하고 있음을 알 수 있습니다. 그러나 디버그하고 Catalog.Parts에 드릴링하려고 할 때마다 유효하지 않은 결과를 얻습니다.

여기서 내가 어디에서 잘못 될지에 대한 경험이 있습니까?

도움이 되었습니까?

해결책

문서화 된대로 여기, 구성 파일에도 다음과 같이 필요합니다.

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

이미 그것을 가지고 있다면, 우리에게 스택 흔적을 보여주는 것이 흥미로울 것입니다. InvalidOperationException 액세스 할 때 얻을 수 있습니다 provider.Parts.

다른 팁

나는 같은 문제가 있었고 그것을 작동시킬 수 없었지만 여기에 몇 가지 세부 사항이 있습니다. composeparts ()는 반사를 기반으로 정적 메소드를 사용하기 때문에 예상대로 작동하지 않는 것 같습니다 (적어도 내가 사용한 버전에서). 필요한 모든 수입품 (따라서이 부분은 MEF 외부에서 변경할 수없는 것 같습니다). 불행히도 우리는 MEF 속성이 아닌 XML 구성을 사용하려고합니다.

ComposeParts ()에서 사용하는 클래스의 멤버에 [가져 오기] 속성을 추가하는 경우 작동합니다. 귀하의 경우 이것은 "프로그램"입니다. 이 경우 구성 파일에 정의 된 모든 내보내기가 있습니다.

해당 문제와 관련된 MEF Contrib 페이지에서 문서 나 예제를 찾을 수 없었습니다. 또한 ComposeParts ()를 사용하는 MEF Contrib Projekt에는 단위 테스트가 없습니다. 해결 방법은 컨테이너를 사용하여 값을 검색하기 위해 컨테이너를 사용하는 것이지만,이 경우 클래스 멤버를 수동으로 설정해야합니다.

도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top