3

私が関与しているプロジェクトでいくつかのアーキテクチャ上の問題に直面しています。プロジェクトは、DI、特に Unity によるコンストラクター注入に依存する ASP.NET MVC 2 アプリケーションです。アプリケーションは、サービスを他のモジュールに公開するいくつかのモジュール (各モジュールはアセンブリのセット) に分割されます。これらのサービスは、アプリケーションの起動時に Unity に登録されます。今まで特別なことは何もありません。私がこれを持っているとしましょう(各モジュールは単純化のためのアセンブリです):

モジュールA、モジュールB。

ModuleA は、次のメソッドを使用してサービス 'IServiceA' を公開します。

IServiceA (操作 1 - 操作 2 - 操作 3)

ModuleB の ServiceB は ModuleA の IServiceA を必要とし、コンストラクター インジェクション (具体的な実装を使用) によって取得します。次に、それを使用します。

問題は、ModuleA が非アクティブ化されている場合 (アプリケーションの起動時に現在のユーザーに対してモジュールがアクティブ化されているかどうかをデータベースで確認します)、serviceA が Unity に登録されていないことです。

Unity が IServiceA の登録を見つけることができず、ServiceB を構築できないため、実行時に例外が発生します。これは正常です。

それに対処するための一連のパターンまたはベストプラクティスがあることを知りたいです。私の最初のことは、ServiceB のコンストラクター注入を取り除くことでした。しかし、その後、ServiceA へのハード リファレンスを使用する必要がありますが、それが気に入らないか、さらに悪い ServiceLocator を使用する必要があります。ServiceA が利用可能かどうかにかかわらず、ModuleB をチェックインしたくありません。他にも多くのサービスがあり、純粋なインフラストラクチャ コードを処理する必要があるためです。serviceA が利用可能かどうか (可能かどうかわからない) の場合、ServiceB が同じコードを実行することを希望します。Gateway パターンを見ましたが、これが役立つかどうかわかりません。

どんな助けでも大歓迎です。

ありがとう、

4

1 に答える 1

3

ModuleA が非アクティブ化されたときに引き継ぐことができる、ある種のデフォルトの実装が必要になります。Null Objectパターンは完璧にフィットするように思えます。

最初に NullServiceA を Unity に登録するだけです。これは、実際の実装によって上書きされない限り、デフォルトの IServiceA になります (ConcreteServiceA と呼びましょう)。

より洗練された実装の場合、 NullServiceA と ConcreteServiceA をCompositeでラップするか、可用性に基づいて一方を選択する別の形式のデコレータをラップできます。

たとえば、挿入された IServiceA インスタンスの最初 (または最後) を常に使用する Composite を持つことができます... または、選択基準は、モジュールがアクティブ化されているかどうかを決定する何らかのメタデータに基づいている可能性があります。非アクティブ化されています (その情報自体は、仮想の IModule インターフェイスにうまく適合するように思えます)。

于 2010-09-13T17:05:59.403 に答える