1

私は自分のコードの一部を、MEFと同じようなことをするプロプライエタリシステムからMEFに変換している最中です。最近遭遇した次の問題をどのように達成するかについて、質問があります。

次のような典型的なエンティティオブジェクトがあります。

public class Account {

    [Import]
    public IAccountServerService { get; set; }
}

そして、上記のエンティティオブジェクトにインポートする必要があるサービスオブジェクト:

public class AccountServerService : IAccountServerService {

    [ImportingConstructor]
    public AccountServerService (Account account) { ... }
}

これを言葉で表現するには、コンストラクターインスタンスにaccount渡されるパラメーターが呼び出し元オブジェクトのオブジェクトである必要があります。このように動作するように:AccountServerServiceAccount

public class Account {

    public IAccountServerService { get { return new AccountServerService (this); } }
}

このシナリオが可能かどうか、またはこの場合にサービスインターフェイスをリファクタリングする必要があるかどうかをお知らせください。

4

3 に答える 3

1

循環依存関係チェーンのインポートの 1 つを遅延インポートに変更できる場合は、機能するはずです。例えば:

[Import] 
public Lazy<IAccountServerService> { get; set; } 
于 2010-08-19T21:48:26.023 に答える
0

したがって、MEF は循環依存関係をサポートしますが、どちらもプロパティ インポートである必要があり、どちらもコンストラクター インポートにすることはできません。したがって、以下はMEFの観点から機能するはずです。もちろん、このアプローチが他の制約によってブロックされているかどうかはわかりません。

public class AccountServerService : IAccountServerService {
    [Import]
    public Account Account { get; set; }

    public AccountServerService () { ... }
}

public class Account {
    [Import]
    public IAccountServerService { get; set; }
}
于 2010-08-19T19:05:11.623 に答える
0

MEF で相互に再帰的なコントラクトが可能か不可能かはわかりません。相互に再帰的なサービス コントラクトを必要としない次のコードに少し分解します。

interface IAccountFactory {
  Account CreateAccount(IAccountServerService service);
}

[Export(typeof(IAccountFactory))]
sealed class AccountFactory {
  Account CreateAccount(IAccountServerService service) {
    return new Account(service);
  }
}

class Account {
   Account(IAccountServerService service) {
      ...
   }
}
于 2010-08-19T15:32:41.830 に答える