2

MEF Contrib(リンク)からのMEFのインポートとエクスポートを処理するために、構成可能なプロバイダーモデルを使用しようとしています。CodeplexのドキュメントとCodeJunkieのブログ投稿(リンク)を読みました。ただし、パーツを作成するためのコンテナを取得できないようです。どこが間違っているのですか?

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コアの一部である(適切なカタログも含む)一般的な属性ベースのシステムに切り替えると正常に動作します。上記の例では、Program.Commandsは常にNULLです。コレクションの代わりに単一のプロパティを使用して、同じ結果を得ようとしました。

デバッグすると、provider.Partsコレクションを取得できるため、構成情報に正しくアクセスしていることがわかります。ただし、デバッグしてcatalog.Partsにドリルインしようとすると、InvalidOperationExceptionが発生します。

私がここでどこが間違っているのか、誰か経験がありますか?

4

2 に答える 2

0

ここに記載されているように、構成ファイルにもこれが必要です。

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

InvalidOperationExceptionすでにそれを持っている場合は、にアクセスしたときに取得するのスタックトレースを表示するのが面白いかもしれませんprovider.Parts

于 2010-01-11T14:40:35.720 に答える
0

同じ問題が発生し、機能させることができませんでしたが、詳細を次に示します。ComposeParts()は、Reflectionに基づく静的メソッドを使用しているため、(少なくとも使用したバージョンでは)期待どおりに機能しないようです。必要なすべてのインポート(したがって、この部分はMEFの外部から変更できないようです)。残念ながら、MEF属性ではなくxml構成を使用したいと考えています。

ComposeParts()で使用するクラスのメンバーに[Import]属性を追加すると機能します。あなたの場合、これは「プログラム」になります。この場合、構成ファイルで定義されているすべてのエクスポートが見つかります。

その問題に関連するドキュメントや例がMEFContribページに見つかりませんでした。また、ComposeParts()を使用するMEFcontribプロジェクトにはユニットテストはありません。回避策はcontainer.GetExportedValues()を使用して値を取得することですが、この場合、クラスメンバーを手動で設定する必要があります。

お役に立てば幸いです。

于 2010-04-28T14:17:12.487 に答える