0

1 つのインフラストラクチャ (Commonライブラリ) とShell.

ここに画像の説明を入力

があることに注意しCommonてくださいFooService、これにはExportAttribute

[Export]
public class FooService
{
}

そして、これはModule1andで使用する必要がありますModule2が、 があるとエラーが発生しImportAttributeます。コメントに注意してください。

[ModuleExport("Module1.ModuleInit", typeof(Module1.ModuleInit))]
public class ModuleInit : IModule
{
    private readonly IRegionManager _regionManager;
    public IServiceLocator _serviceLocator;

    // [Import(AllowRecomposition=true)]
    public FooService _service;

    [ImportingConstructor]
    public ModuleInit(IRegionManager regionManager, IServiceLocator serviceLocator)
    {
        _regionManager = regionManager;
        _serviceLocator = serviceLocator;
    }

    public void Initialize() { }
}

このコードは と同じですModule2

モジュール 'Module2.ModuleInit' の初期化中に例外が発生しました。- 例外メッセージは次のとおりです。構成は変更されません。次のエラーのため、変更は拒否されました: 構成で 1 つの構成エラーが発生しました。根本的な原因を以下に示します。詳細については、CompositionException.Errors プロパティを確認してください。

1) 制約 '((exportDefinition.ContractName == "Common.FooService") AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "Common.FooService".Equals(exportDefinition.Metadata) .get_Item("ExportTypeIdentity"))))'.

結果: インポート 'Module1.ModuleInit._service (ContractName="Common.FooService")' を部分 'Module1.ModuleInit' に設定できません。要素: Module1.ModuleInit._service (ContractName="Common.FooService") --> Module1.ModuleInit --> AssemblyCatalog (Assembly="Module1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")

この例外が発生するのはなぜですか? 1 つのオブジェクトをエクスポートしているだけです。何が起こっているのか、それを修正する方法を知りたいです。

非常に小さなプロジェクトですので、お気軽にダウンロードしてください。 コンパクトなプロジェクトをダウンロード

4

2 に答える 2

0

解決策:シェル プロジェクトを除く各プロジェクトを調べて、参照を確認します。以下をせよ:

  • MEFを使用しているため、unityextension参照を削除するだけです
  • "Common" 参照プロパティ "Copy local" を False に設定します
  • "Microsoft.Practices.Prism" 参照プロパティ "Copy local" を False に設定します
  • "Microsoft.Practices.Prism.MefExtensions" 参照プロパティ "Copy local" を False に設定します
  • "Microsoft.Practices.Prism.ServiceLocation" 参照プロパティ "Copy local" を False に設定します
  • 「System.ComponentModel.Composition」参照プロパティ「Copy local」を False に設定します

Bootstrapper クラスに移動し、これを追加します。

protected override void ConfigureAggregateCatalog()
        {
            base.ConfigureAggregateCatalog();

            // Add this assembly to the catalog.
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Bootstrapper).Assembly));

            // Add the FooService assembly
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(FooService).Assembly));
        }

次に、モジュールの [Import(AllowRecomposition)] と FooService のコメントを外します。

プロジェクトを実行する前に、Visual Studio のメニューに移動し、[ビルド] -> [プロジェクトの消去] を選択する必要があります。これにより、以前にローカルにコピーされていたすべての dll ファイルが削除されます。

于 2012-09-06T00:47:42.597 に答える
0

これは実際には単なるコメントである必要がありますが、まだそれを行うのに十分な担当者がいません。とにかく、それはスコープの問題のように私には見えます。MEF v1 は自動的にエクスポートをシングルトンとして扱うべきだと思いますが、v2 では逆になっていると思います - どのバージョンを使用しているかわかりません。私は最近、Microsoft.Composition (MVC の MEF) を使用して問題に遭遇し、HTTP 要求レベルのスコープを使用して、要求全体で単一のインスタンスを取得することで解決しました。

[System.Composition.Export(typeof(ICustomDbContext))]
[System.Composition.Shared(Boundaries.HttpRequest)]
public class CustomDbContext : ICustomDbContext { ... }
于 2012-08-16T20:58:09.940 に答える