0

最近、アプリケーションでMEFの使用を開始しましたが、MEFを使用したり、メインアプリケーション内で動作するクラスをテストしたりすることに問題はありません。ただし、アプリケーションのライセンスライブラリを作成し始めたばかりで、設定方法がわからないため、いくつかの問題が発生しました。

ライセンスライブラリには、LicenseManager、LicenseValidator、およびLicenseSignerクラスがあります。

public class LicenseManager
{
    [Import]
    private ILicenseValidator _validator;

    [Import]
    private ILicenseSigner _signer;

    public LicenseManager()
    {
        var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
        var container = new CompsitionContainer();
        container.ComposeParts();
    }
}

[Export(typeof(ILicenseSigner))]
public class LicenseSigner : ILicenseSigner
{
    ...
}

[Export(typeof(ILicenseValidator))]
public class LicenseValidator : ILicenseValidator
{
    ...
}

検証者と署名者の両方がnullそれらにアクセスした後です。

これは、LicenseManagerのコンストラクターがコンテナーを作成する前にLicenseManagerをインスタンス化しているためだと思います。ただし、LicenseManagerはクラスライブラリへの唯一のエントリポイントとして意図されているため、問題を解決する方法が完全にはわかりません。コンテナを初期化してLicenseManagerインスタンスを返すために、ある種のファクトリを作成することもできますが、その結果、ライブラリAPIの品質が低下します。

私はMEF全体に少し慣れていません。もっと上手くできることはありますか?メインアプリケーションでのすべてのMEFの読み込みを処理する方法はありますか?どんな解決策も、私が今持っている解決策の欠如よりも優れています。

4

1 に答える 1

1

呼び出しを構成するにはComposeParts、少なくとも1つの属性付きオブジェクトが必要です。LicenseManagerの引数としてを渡す必要がありますComposeParts。したがって、コードの完全なセットは次のようになります。

public class LicenseManager
{
    [Import]
    private ILicenseValidator _validator;

    [Import]
    private ILicenseSigner _signer;

    public LicenseManager()
    {
        var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
        var container = new CompsitionContainer(catalog);
        container.ComposeParts(this);
    }
}

[Export(typeof(ILicenseSigner))]
public class LicenseSigner : ILicenseSigner
{
    ...
}

[Export(typeof(ILicenseValidator))]
public class LicenseValidator : ILicenseValidator
{
    ...
}

私のテストでは、上記のコードは機能しました。

もう1つのアイデアは、カタログの選択をライブラリを実装するコードに委任することです。コンストラクターは次のようになります。

public LicenseManager(AggregateCatalog catalog)
{
    var container = new CompsitionContainer(catalog);
    container.ComposeParts(this);
}

これにより、ライセンスライブラリを実装するプログラムで、エクスポートの送信元を指定できます。

于 2012-07-13T21:00:38.773 に答える