9

ときどき、特定の条件が満たされた場合にのみサービスを解決する必要がある状況に陥ることがあります。たとえば、ユーザーが電子メールまたはSMS通知の送信を選択する場合があります。ユーザーが選択した内容に応じてメールまたはSMSサービスを遅延読み込みして、両方を読み込み、リソースを浪費する必要がないようにします(たとえば、ユーザーに10個のオプションがある場合は...? )。

私が抱えている問題は、ブートストラップコードの外部でコンテナを使用することです(コードをコンテナに依存させたくありません)。遅延読み込みサービスにコンテナを使用する方法を見つけることができないようです(必要なサービスを手動で作成し、すべてのDIを手動で実行しない限り)。これはルールを曲げることができる状況ですか、それともそれを行うためのより良い方法がありますか?

4

3 に答える 3

5

Castle Windsor 3.0 以降を使用している場合は、遅延解決を使用できます。

詳細については、Windsor 3 の新機能を参照してください

登録プロセスが少し変わります (新しいコンポーネント ローダーを登録する必要があります)。

その後は、いつものようにコンポーネントを登録するだけですが、依存関係をLazy<T>ではなくとして解決しTます。.ValueのプロパティにアクセスしないLazy<T>限り、依存関係は解決されないため、遅延評価されたオブジェクトをいくつか渡し、必要なときに必要なオブジェクトのみにアクセスできます。

ユーザーにもっと多くのオプションがある場合は、ある種の抽象的なファクトリ インターフェイスを作成することを検討する必要があります。次に、このファクトリのみを登録して解決し、ファクトリ自体が通知を送信するための適切なサービスを作成します (メール、SMS、またはその他のオプション)。ファクトリの実装は手動でコーディングするか、Castle Windsor でコーディングできます (バージョン 3.0 以降だと思います)。

多くの場合、そのようなファクトリを使用するときは、手動で実装し、コンテナを依存関係として渡すため、ファクトリの実装のみがコンテナに依存します。

于 2012-12-26T15:36:56.907 に答える
3

単純化するための単なる例(Marcin Deptułaの回答に基づく)

// activate Lazy initialization feature  for all Components
.Register(Component.For<ILazyComponentLoader>().ImplementedBy<LazyOfTComponentLoader>())     
// register rest of component(s)
.Register(Component.For<IIssueRepository>().ImplementedBy<IssueRepository>()) 
. ....

遅延解決 (プロパティ インジェクション)

public Lazy<IIssueRepository> IssueRepository { get; set; }
IssueRepository.Value.GetLastIssue();

通常の解決 (プロパティ インジェクション)

public IIssueRepository IssueRepository { get; set; }
IssueRepository.GetLastIssue();
于 2013-08-21T05:04:46.763 に答える
1

一般に、 Typed Factory Facilityを使用してそれを行うことができます。

簡単に言えば、これらのサービスを使用するコンポーネントを解決するときに、電子メールまたは SMS サービスを提供する代わりに、それらを作成できるファクトリを提供します (コンテナへの参照なしで定義されます)。

ファシリティは (作成したインターフェースから) ファクトリを「実装」するので、やることはほとんどありません。

于 2012-12-26T15:37:51.257 に答える