CSharp - 解析时,如何设置 Castle.WindsorContainer 不包装已知的异常

  显示原文与译文双语对照的内容

我使用castle通过构造函数注入来解析依赖性。 我的问题是,服务的构造函数可能使用 3rd 方插件代码。 如果这个插件代码抛出异常,它将被包装在一个已知的异常中,比如"knownexception"。

我有一个特殊的异常策略来记录和处理"knownexception"。 问题是如果 Castle Windsorcontainer解析遇到异常,它将被封装在'Castle.MicroKernel.ComponentActivator.ComponentActivatorException'. 中

是否有办法避免这种情况,让'knownexception'传播?

一个简单的场景:


public class KnownException : Exception
{

}

//registerd in castle
public class DetailViewModel
{
 public DetailViewModel(Selector thirdPartySelector)
 {
 thirdPartySelector.GetElements();//might throw known exception
 }
}

//registered as TypedFactory in Castle
public interface IViewModelFactory
{

 DetailViewModel Create(Selector thirdPartySelector);
}


public class MasterViewModel
{
 private readonly IViewModelFactory viewModelFactory;
 private readonly Selector selector;

 public MasterViewModel(IViewModelFactory viewModelFactory)
 {
 this.viewModelFactory = viewModelFactory;
 selector = Mock.Of<Selector>();//for illustration purpose only. Creation is more elaborate, and not relly a problem here.
 }


 public void OnAddDetailed()
 {
 try
 {
 var vm = viewModelFactory.Create(selector);

//adding detailed view model.

 }
 catch (KnownException e)
 {
//Log and continue
 }
 }
}

}

时间: 原作者:

显然,ComponentActivatorException 在Castle试图解析组件之前包装了初始异常。 没有办法绕过这种行为。

最好的方法是捕获 ComponentActivatorException 并抛出 InnerException,以便再次查找错误处理的已知类型

原作者:

要使用组件激活器避免 castle,你可以使用 UsingFactoryMethod IE 来 register 组件:


Component.For<IFoo>().UsingFactoryMethod(k => new Foo())

存在一些缺点:如果 Foo 有依赖关系,你需要自己从容器中解决这些问题,拦截器不会工作。 如果需要,OnDestroy 可以帮助释放依赖关系。

原作者:
...