2017-06-16 20 views
4

私はMEF(System.Composition)を介してプラグインコンストラクタにパラメータを渡す方法を理解しようと数時間を費やしましたが、それは役に立たないものです。言うまでもなく、適切なドキュメントがほとんどなく、ソースコードを見ても役に立たなかった。.NETコアでMEF経由でプラグインコンストラクタにパラメータを渡しますか?

これは、CompositionHost.ComposeExportedValueメソッドを使用して、実際には簡単でしたが、.NET Coreバージョンでは動作するものが見つからないようです。私は、不完全なコードを以下で囲み、例外がスローされました。

この点に関するお手伝いがあれば幸いです。一部の>輸入で必要とされる 'コード' - おかげで....

using System; 
using System.Composition; 
using System.Composition.Hosting; 
using System.Reflection; 

namespace MefMe 
{ 
    public interface IPlugin 
    { 
     void Alert(); 
    } 

    [Export(typeof(IPlugin))] 
    public class Plugin : IPlugin 
    { 
     private string code; 

     [ImportingConstructor] 
     public Plugin(string code) 
     { 
      this.code = code; 
     } 

     public void Alert() => Console.WriteLine(code); 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var config = new ContainerConfiguration() 
       .WithAssembly(Assembly.GetEntryAssembly()); 

      var container = config.CreateContainer(); 

      // Throws a CompositionFailedException; see notes 
      var plugin = container.GetExport<IPlugin>(); 

      plugin.Alert(); 
     } 
    } 
} 

System.Composition.Hosting.CompositionFailedExceptionが発生した
HRESULT = 0x80131500メッセージ=いいえ輸出は、契約 '文字列' が見つかりませんでした'プラグイン' - >契約のための最初の要求 'IPlugin' ソース=のStackTraceで を必要と: System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.CheckTarget(CompositionDependency 依存、HashSetの1 checked, Stack 1チェック)で System.Composition.Hostingで。 Core.ExportDescriptorRegistryUpdate.CheckDepend System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.Execute(CompositionContract でSystem.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.CheckTarget(CompositionDependency 依存、HashSetの1 checked, Stack 1チェック)でency(CompositionDependency 依存、HashSetの1 checked, Stack 1チェック) Systeで System.Composition.Hosting.Core.LifetimeContext.TryGetExport(CompositionContract 契約で System.Composition.Hosting.Core.ExportDescriptorRegistry.TryGetSingleForExport(CompositionContract exportKey、ExportDescriptor & defaultForExport)、オブジェクト&輸出)で契約) System.Composition.CompositionContext.GetExport(CompositionContract コントラクト) のMe:Me.Main(String [] args)デスクトップ\ MefMe \ MefMe \ Program.cs:行36

答えて

2

残念ながらComposeExportedValueは現在サポートされていません。この機能をリクエストしているのはGithub Issueです。

このトリックを行うには、長引く回避策があります。人口の多い値ですぐに輸出品を作り出す方法はありません。あなたが行うことができるのは、静的なパラメータ・バッグを介してコンストラクタに設定された値で明示的なプロパティのエクスポートを作成することです。自分のコードスニペットを更新して自分のソリューションを表示しました。

namespace MefMe 
{ 
    public interface IPlugin 
    { 
     void Alert(); 
    } 

    [Export(typeof(IPlugin))] 
    public class Plugin : IPlugin 
    { 
     private string code; 

     [ImportingConstructor] 
     public Plugin([Import("code")] object code) 
     { 
      this.code = (string)code; 
     } 

     public void Alert() => Console.WriteLine(code); 
    } 

    public class Parameters 
    { 
     public static IEnumerable<Tuple<string, object>> PopulatedParameters { get; set; } 
     [Export("code", typeof(object))] 
     public object code { get; set; } 

     public Parameters() 
     { 
      foreach (var param in PopulatedParameters) 
       SetParameter(param.Item1, param.Item2); 
     } 

     void SetParameter(string nameOfParam, object value) 
     { 
      var property = typeof(Parameters).GetProperty(nameOfParam, BindingFlags.Public | BindingFlags.Instance); 
      property.SetValue(this, value); 
     } 


    } 

    public class Program 
    {   
     static void Main(string[] args) 
     { 
      Parameters.PopulatedParameters = new Tuple<string, object>[] { new Tuple<string, object>("code", "myvalue") }; 

      var config = new ContainerConfiguration() 
       .WithAssembly(typeof(IPlugin).Assembly); 
      var container = config.CreateContainer(); 

      // Throws a CompositionFailedException; see notes 
      var plugin = container.GetExport<IPlugin>(); 

     } 
    } 
} 
0

これで、独自のExportDescriptorProviderを構築する必要があります。次に、 "WithProvider"を使用してコンテナの設定に追加します。ここにはexampleがあります。

(その1は、ほぼ正確に同じ質問をしました。)

誰も他の人の仕事のための信用を取ることを意味しないでください。私はちょうどstackoverflowはSystem.Compositionに関連する多くの材料を使用することができると思う。

関連する問題