1

ビジネス ロジック用のモデル アセンブリ (Model クラスを含む) を使用する asp.net アプリケーションがあります。このモデル アセンブリは、IMailService インターフェイスを介して MailService に依存しており、MEF を使用して MailService 実装のモデルのニーズを満たすことを試みています。Model クラスのコンストラクターで MEF 合成を行っています。

この背後にあるアイデアは、サイト自体がメールの送信方法を知る必要なく、Web サイト間で再利用できる MailService アセンブリを作成することです。IoC コンテナーの方が適しているかもしれませんが、MEF アプローチの方が理解しやすく、パーツを組み合わせてアプリを構成するというアイデアが気に入っています。また、IoC コンテナーと比較した場合、mef アプローチにはマイナス面がありますか?

[Import]
private IMailService _mailService;

public Model()
{
    Compose();
}

private void Compose()
{
     DirectoryCatalog cat = new DirectoryCatalog(Settings.Default.PluginsFolder);
     var container = new CompositionContainer(cat);
     container.ComposeParts(this);
}

以下のコードは別のアセンブリにあり、インターフェイスはさらに別のアセンブリにあります

[Export(typeof(IMailService))]
public class MailService : IMailService
{
}

これは、モデル アセンブリの単体テストでは問題なく動作しますが、asp.net サイトからモデル アセンブリを使用すると、以下の例外で失敗します。また、web.configで信頼を完全に設定しようとしましたが、まだ運がありません

構成は相変わらず。次のエラーのため、変更は拒否されました: 構成で 1 つの構成エラーが発生しました。根本的な原因を以下に示します。詳細については、CompositionException.Errors プロパティを確認してください。

1) 制約に一致するエクスポートが見つかりませんでした"ExportTypeIdentity"))))'.

結果: Model.Model' の一部に import Model.Model._mailService (ContractName="ExtensionInterfaces.IMailService")' を設定できません。要素: Model.Model._mailService (ContractName="ExtensionInterfaces.IMailService") --> Model.Model

4

2 に答える 2

1

エラーが見つかりました。エクスポートしたMailServiceアセンブリと同じ名前のアセンブリがbinフォルダーにありました。何らかの理由で、カタログは、指定したカタログのアセンブリではなく、binフォルダーのアセンブリを取得しました。理由はわかりませんが、少なくともbinフォルダーから古いアセンブリを削除すると機能しました。

于 2009-08-24T15:30:26.533 に答える
1

私はまだ Web アプリケーションで MEF を使用したことがありませんが、プラグイン ディレクトリ内のアセンブリの読み取りに何らかの問題があると推測できます。パーミッションの問題か何かかもしれません。とにかく、DirectoryCatalog を調べて、期待どおりの内容が含まれているかどうかを確認することから始めます。

于 2009-08-24T05:26:54.853 に答える