Exception 如何处理Castle Windsor可选属性注入期间引发的异常?

Exception 如何处理Castle Windsor可选属性注入期间引发的异常?,exception,exception-handling,dependency-injection,castle-windsor,property-injection,Exception,Exception Handling,Dependency Injection,Castle Windsor,Property Injection,温莎城堡3.2提供了一个很酷的补充。这帮助我将容器日志重定向到用于存储应用程序日志的log4net日志文件 我现在想做的是能够在注入可选属性时捕获容器检测到的异常 在我的特定情况下,Castle试图执行我的代码,将数据库属性注入BaseController类时,引发了Oracle数据库错误ORA-28000:帐户被锁定: public class BaseController : Controller { /// <summary> /// Repository in

温莎城堡3.2提供了一个很酷的补充。这帮助我将容器日志重定向到用于存储应用程序日志的log4net日志文件

我现在想做的是能够在注入可选属性时捕获容器检测到的
异常

在我的特定情况下,Castle试图执行我的代码,将
数据库
属性注入
BaseController
类时,引发了
Oracle
数据库错误
ORA-28000:帐户被锁定

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; }
}

使用属性注入是否可能出现这种情况?

当您有可选的依赖项时,最好使用


它可以防止出现
NullReferenceException
,并且您可以提供您期望的行为(不执行任何操作、抛出特定异常、记录跟踪等)

正如Krzysztof Kozmic在他的文章中提到的,我们不应该有任何代码在注入属性时尝试进行外部对象初始化

正如我在随后的文章中所描述的,我的问题是在初始化属性时试图打开数据库连接

我删除了该代码,现在只有在我自己的域代码中首次使用该注入属性时才会引发异常


今天我遇到了同样的问题:帮助我找出错误的一件事是暂时使用
构造函数注入
,如下所示:

private OEVizion _database;

public ReportingPeriodsController(OEVizion database)
{
    _database = database;
}
通过这样做,我能够看到错误:log4net(oevision类库中的log4net和.Web项目中使用的log4net)之间的版本不匹配


在正确初始化EF上下文后,我又回到了
属性注入
,我又开始工作了D

您的代码是如何导致抛出异常的?这类代码(尝试访问数据库)最好不要作为外部对象初始化的一部分执行(如设置属性),但如果您想对其执行操作并补偿错误,它应该成为您的核心域的一部分suggest@KrzysztofKozmic是的。。。在
数据库
属性初始化/注入期间,会进行一项检查,以确保从
Web.config
通过Castle的
DependsOn
传递的
连接字符串
是正确的,我们会尝试打开一个数据库连接来测试它是否正确。然后我们立即关闭该连接并完成初始化。这就是问题所在:传入连接字符串的用户被锁定(上面显示的ORA ex),并且该ex被Windsor吞下。现在,至少在内置日志诊断的帮助下,我可以在log4net日志文件中捕获该异常。
public BaseController() {
    Database = NullLogRepository.Instance;
}
private OEVizion _database;

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