私は MEF について少し混乱しています。理解し始めたと思っていましたが、完全には理解できていないようです。
そのため、読み込みたい XML のテスト ステップのリストがあります。メイン アプリケーションは、実行時に型について何も認識しないという考え方です。
<TestSteps>
<TestRunner xsi:type="SimulateDc" Measurement="54"/>
<TestRunner xsi:type="MeasureDc" Output="1"/>
</TestSteps>
したがって、ステップ間で渡す情報を保存できる静的な「結果」クラスを持つ基本型があります (Output
上記の XML の属性)。ここでのテスト ハンドラーは MEF によってエクスポートされます。実行時にそれらを読み取りType
、XML シリアライザーに渡してハンドラーのリストを作成します。これはすべて機能し、テスト ランナーのリストを取得します。ここに各タイプのエクスポートがあるDataTemplate
ので、コンテンツ コントロールを使用すると、自分自身を描画する方法を認識します。すべてが順調に思えますが、私の思考プロセスは間違っていると思います。
1 つの問題は、インポートされたハンドラーをいくつかのハードウェアに結び付けたいということです。ハードウェア処理ルーチンは、さらに多くの MEF インポートによって処理されることを意図しています
したがって、次のようなインターフェースを使用します。
public interface IMeasureHW
{
double Measure();
}
次に、これを使用します:
[Export("MeasureDc", typeof(IMeasureHW))]
public class MeasureDcHW : IMeasureHW
{
public double Measure()
{
return 54.0;
}
}
次に、テスト ハンドラーの 1 つで、次のようにしました。
[Import("MeasureDc", typeof(IMeasureHW))]
IMeasureHW hardware { get; set; }
私のインポートは次のように実行されます。
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog("."));
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
_container = new CompositionContainer(catalog);
_container.ComposeParts(this);
MainWindow.Show();
}
ただし、上記の XML シリアライゼーションを推測しており、このType
情報をそのまま使用すると、インポートが null になることは間違いないため、設計に関する私の思考パターンが間違っていることを意味します。
私はCompositionContainerをエクスポートすることでそれを機能させることができました.XMLをロードした後、私はこれを行うことができます:
foreach (TestRunnerBase t in testSteps)
{
_container.SatisfyImportsOnce(t);
}
しかし、インポートされたテスト ステップの最初のリストは、型の取得以外には使用されていないため、これは少し間違っているように感じます。したがって、データを MEF パーツとしてエクスポートしてから、ハンドラーを個別にエクスポートする必要があると考えていました。その後、XML からデータのリストを読み取るときに、リストからハンドラーを要求しますか? それが理にかなっている場合は?
App.xaml.cs
MEF 構成はすべて私で処理され、テスト ステップは別のビュー モデルにあるため、この方法でそれらを結び付ける方法がわかりませんでした。メタデータを使用してデータをハンドラーに結び付け、インポートされたリストで対応するハンドラーを見つけるという行に沿って何かを考えていました。おそらく、ルックアップを高速化するために辞書を作成するために最初の解析を実行する必要がありますか?
これは、それが行われるべき方法ですか?どんな助けにも感謝します。私はすでに髪の部門でかなり軽いので、これ以上失うわけにはいきません