【发布时间】:2014-01-08 22:35:48
【问题描述】:
Castle Windsor 3.2 提供了一个很酷的附加功能,即Diagnostic logging in the container。这帮助我将容器日志重定向到用于存储应用程序日志的 log4net 日志文件。
我现在想做的是能够在注入我的可选属性时实际捕获容器检测到的Exception。
在我的具体情况下,当 Castle 尝试执行我的代码以在 BaseController 类中注入 Database 属性时,引发了 Oracle 数据库错误 ORA-28000: the account is locked:
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 的控制器中的操作方法中时。这一切都是因为温莎城堡“吞下了”例外。用户收到的唯一消息是: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);
}
}
}
这种情况可以通过属性注入实现吗?
【问题讨论】:
-
你的代码做了什么导致异常被抛出?这种代码(试图访问数据库)最好不要作为外部对象初始化的一部分执行(比如设置属性时),但是如果你想对它采取行动并补偿错误,它应该成为你核心域的一部分我建议
-
@KrzysztofKozmic 是的...在
Database属性初始化/注入期间,检查以确保connection string从Web.config通过Castle 的DependsOn是正确的,我们尝试打开数据库连接只是为了测试它是否正确。然后我们立即关闭该连接并完成初始化。这就是问题所在:传入连接字符串的用户被锁定(如上所示的 ORA 前),并且该前是 Windsor 的swallowed。现在至少在内置日志诊断的帮助下,我可以在 log4net 日志文件中捕获该异常。
标签: exception exception-handling dependency-injection castle-windsor property-injection