0

Castle Windsor 3.2 は、コンテナー内の診断ログという優れた追加機能を提供します。これにより、コンテナー ログを、アプリケーション ログの保存に使用されている log4net ログ ファイルにリダイレクトすることができました。

私が今やりたいことはException、オプションのプロパティを注入している間にコンテナが検出したものを実際にキャッチできるようにすることです。

私の特定の状況では、 Castle が私のコードを実行してクラスにプロパティを注入しようとしたときに、Oracleデータベース エラーが発生しました。ORA-28000: the account is lockedDatabaseBaseController

public class BaseController : Controller
{
    /// <summary>
    /// Repository interface injected by Castle Windsor IoC container.
    /// See <see cref="MyProject.Widgets.CastleWindsor.Facilities.PersistenceFacility.Init()"/> for more information.
    /// </summary>
    public ILogRepository Database { get; set; }
}

このDatabaseプロパティはnull、から継承するコントローラーのアクション メソッド内にいるときですBaseController。これはすべて、Castle Windsor が例外を「飲み込む」ために発生します。ユーザーが受け取る唯一のメッセージは次のとおりObject reference not set to an instance of an objectです。わかりましたが、実際の例外/理由をユーザーに表示したいと思いますORA-28000: the account is locked。このメッセージは、前述の診断ログのおかげで、Castle Windsor によってログに記録されます。catchこれはクールですが、ブロック内で例外を実際にキャッチできるようにしたいと考えています。

public class SubCatListController : BaseController
{
    public ActionResult SubCatList(string subcat)
    {
        try
        {
            var sub = Database.GetLogSubCategory(subcat);
        }
        catch(Exception e) // I'd like to get the real exception from Castle Windsor here...
        {
            Logger.Error(e.Message, e);
        }
    }

}

このシナリオはプロパティ インジェクションで可能ですか?

4

2 に答える 2

1

Krzysztof Kozmic がコメントで述べたように、プロパティの注入中に外部オブジェクトの初期化を試みるコードはありません。

この後続のコメントで説明する私の問題は、プロパティの初期化中にデータベース接続を開こうとしたことでした。

そのコードを削除したところ、注入されたプロパティが初めて使用されたときに、自分のドメイン コードでのみ例外が発生するようになりました。


今日、私はこの同じ問題にぶつかりました.エラーを理解するのに役立ったのは、Constructor injection代わりに次のように一時的に使用することでした:

private OEVizion _database;

public ReportingPeriodsController(OEVizion database)
{
    _database = database;
}

これを行うと、エラーの内容を確認できました: log4net 間のバージョンの不一致 - OEVizion クラス ライブラリ内のものと .Web プロジェクトで使用されるもの。

EF コンテキストを正しく初期化した後、Property injection元に戻り、ビジネスに戻りました。:D

于 2014-01-11T00:59:58.623 に答える
0

オプションの依存関係がある場合は、常にNull オブジェクト パターンを使用することをお勧めします。

public BaseController() {
    Database = NullLogRepository.Instance;
}

を防ぎ、NullReferenceException期待どおりの動作を提供できます (何もしない、特定の例外をスローする、トレースにログを記録するなど)。

于 2014-01-09T08:37:00.737 に答える