4

私は 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.csMEF 構成はすべて私で処理され、テスト ステップは別のビュー モデルにあるため、この方法でそれらを結び付ける方法がわかりませんでした。メタデータを使用してデータをハンドラーに結び付け、インポートされたリストで対応するハンドラーを見つけるという行に沿って何かを考えていました。おそらく、ルックアップを高速化するために辞書を作成するために最初の解析を実行する必要がありますか?

これは、それが行われるべき方法ですか?どんな助けにも感謝します。私はすでに髪の部門でかなり軽いので、これ以上失うわけにはいきません

4

1 に答える 1

0

間違っている場合は修正してください - インポートを連鎖させることで目標を達成できるようです: 最も内側がTestRunnerコレクション、次にハードウェア クラス、最後にコンテンツ コントロールです。

以下の例では、これらはそれぞれClass2 : MySubInterfaceClass1 : MyInterface、およびProgramです。

/////inner

using MyHostingNamespace;
namespace ClassLibrary1
{


    [Export("class2", typeof(MySubInterface))]
    class Class2 : MySubInterface
    {
        public string MyProperty { get; set; }

        public Class2()
        {

            MyProperty = "Class2";
        }
    }
} 

////middle

using MyHostingNamespace;
namespace ClassLibrary1
{


    [Export("class1", typeof(MyInterface))]
    public class Class1 : MyInterface
    {
        [Import("class2", AllowDefault=true)]
        MySubInterface myClass2;

        public string MyProperty {get;set;}

        public Class1()
        {

            AggregateCatalog catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
            CompositionContainer _container = new CompositionContainer(catalog);
            _container.ComposeParts(this);

            MyProperty = myClass2.MyProperty;
        }
    }
}

////outer

namespace MyHostingNamespace
{
    class Program
    {
        [Import("class1")]
        public MyInterface class1;

        public Program()
        {
            AggregateCatalog catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
            catalog.Catalogs.Add(new DirectoryCatalog("."));
            CompositionContainer _container = new CompositionContainer(catalog);

            _container.ComposeParts(this);

        }

        static void Main(string[] args)
        {

            Program p = new Program();

            Console.WriteLine(p.class1.MyProperty);

        }

    }



    public interface MyInterface
    {
        string MyProperty { get; set; }
    }

    public interface MySubInterface
    {
        string MyProperty { get; set; }
    }
}
于 2013-08-18T01:35:07.843 に答える