2012-12-26 13 views
8

時には、特定の条件が満たされている場合にのみサービスを解決する必要のある状況に遭遇することがあります。たとえば、ユーザが電子メールまたはSMS通知を送信するように選択することができます。ユーザーの選択に応じてメールやSMSのサービスを怠るようにしたいのですが、その両方のリソースとリソースを無駄にする必要はありません。 )。城ウィンザー・レイジー・ロード・サービス

問題は、私のブートストラップコードの外側のコンテナを使用することです(私のコードはコンテナに依存したくない)。私は手を使って必要なサービスを作成し、すべてのDIを手動で行わない限り、遅延ロードサービスのためにコンテナを使用する方法を見つけることができないようです。これはルールが崩れたり、より良い方法がある状況ですか?

答えて

5

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

What's new in Windsor 3 for more detailsを参照してください。

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

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

ユーザにもっと多くのオプションがある場合は、ある種の抽象的なファクトリインタフェースを作成することを検討する必要があります。このファクトリだけを登録して解決すると、ファクトリ自体が通知を送信するための適切なサービスを作成します(メールまたはSMSまたはその他のオプション)。工場のインプリメンテーションは手作業でコード化することもできますし、Windsorもそうすることができます(私はバージョン3.0から考えています)。

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

1

通常、Typed Factory Facilityでこれを行うことができます。一言で言えば

、あなたの代わりにそれを電子メールまたはSMSサービスを与えることで、それらのサービスを使用するコンポーネントを解決するとき、あなたはへの参照せずに、それをあなたによって定義され、それらを作成することができます工場を(与えますコンテナ)

ファシリティは、(作成するインターフェイスから)ファクトリを "実装"することになるため、行うことはほとんどありません。

+0

どうかの私のサービスはそれぞれ独自の依存関係を持っています。たとえば、smsサービスには3つの固有の依存関係があり、電子メールサービスには4つの固有の依存関係があります。偉大な応答btw。 – orourkedd

+0

工場はキャッスルによって実装されています。いつものようにサービスを設定するだけです。 –

2

(マルチン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(); 
関連する問題