2011-02-07 12 views
2

Castle.WindsorASP.NET MVC(3.0)に使用すると、依存関係の1つがnullを解決した場合に、適切に処理できる方法はありますか?たとえば、IMembershipServiceがあるとします。Castle.Windsor、ASP.NET MVC、インジェクションのNull解決を処理する

class ServiceInstaller 
{ 
// ... 
void Install(// ..) 
{ 
    container.Register(
    Component 
    .For<IMembershipService>() 
    .ImplementedBy<MembershipService>() 
    .LifeStyle.PerWebRequest 
); 
} 
} 

これはうまく動作します。今では、おそらく私のサイトのすべてがユーザーにログインする必要はありません。おそらく私のWebホストのデータベースサーバーが数時間クラッシュしたとしましょう。この場合、データベースを参照したり、ISessionを呼び出そうとするとnullが返されることがあります。

この場合、私は何ができますか?私はif(membershipService == null)を100回以上書くことができますが、それはかなりばかげているようです。 と言う組み込みのソリューションはありますか "とにかく、エラーがあれば、これを行うのですか?"

+0

DBサーバーがクラッシュした場合、DBクエリは* throw **、** never ** nullを返す必要があります。 –

答えて

4

サービスは決してnullではないと思います。それでもデータベースがダウンしている場合は、サービスを返す必要がありますが、そのメソッドは例外をスローし、サービスの意味に応じてnullまたは何らかのデフォルト値を返します。

+0

それにもかかわらず、探しているものが見つからないという状況に対処する方法が必要です。サービスが正しく返されない場合、デフォルトの動作を設定する方法はありますか? – Ciel

+0

@Stacey:具体的で妥当な例を挙げることができますか? –

+0

@Mauricio:何かがエラーを起こす可能性があります...それは非常に広いスペクトルです。 Castle.Windsorは、不適切な解決策を処理するだけのものは何もありませんか?プロパティインジェクション。私が使用していない_ log4netではないロガーなどのプロパティを設定しようとすると、権限エラーのような予期しない状況のために書き込むファイルがない場合にnullを解決できます。または、ログインしているユーザーに関する情報を解決しようとすると、コントローラーの破棄でヌルが返されることがあります。実際、これが私をこのことを理解しようとするまでに持ち込んだ非常に大きな問題です。 Castleはコントローラーを「解放」したときに何か – Ciel

0

Ciel、i had this problem just recentlyと答えを探している間にあなたの質問を見つけました。

基本的に、実行時にラップコンポーネントでコンポーネントを解決するには、型付きファクトリを使用する必要があります。探しているコンポーネントに関する一致がない場合は、デフォルトのオブジェクトを返さなければなりません。必要な動作を実装するデフォルトのオブジェクトです。

IMembershipServiceの場合は、インターフェイスを継承して何もせずに、不要なコンポーネントのデフォルトにするNotCheckingMembershipServiceクラスを実装します。特定のメンバーシップサービスを特定のコントローラーにリンクすることができます。

オープンIMembershipService

のためにあなたは一般的な「キャッチオール」の実装に

public class NotCheckingMembershipService<T>: IMembershipService<T> where T: Controller 
{ 
} 

を作成し、デフォルトのコンポーネントとして、それを登録する必要があり

_container.Register(
      Component.For(typeof(IMembershipService<>)) 
      .ImplementedBy(typeof(NotCheckingMembershipService<>)) 
      .IsDefault()); 

を行うには、単にあなたのカスタムメンバーシップサービスを登録必要に応じて解決は失敗せず、常にインターフェイスを呼び出すことができます。

関連する問題