有没有安全的方法来解析来自 Castle.Windsor 的组件?
Is there safe way to resolve component from Castle.Windsor?
我有 ControllerFactory 的实现来处理控制器中的构造函数注入,但是我想使用默认方式来解析控制器,以防其中一些控制器未注册:
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IWindsorContainer _container;
public WindsorControllerFactory(IWindsorContainer container)
{
_container = container;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType != null)
{
try
{
return _container.Resolve(controllerType) as IController;
}
catch(Exception ex)
{
return base.GetControllerInstance(requestContext, controllerType);
}
}
else
{
return base.GetControllerInstance(requestContext, controllerType);
}
}
}
有效,但我真的很想避免异常
使用container.Kernel.HasComponent(Type type)
:
bool isRegistered;
var container = new WindsorContainer();
isRegistered = container.Kernel.HasComponent(typeof(IFoo));
Console.WriteLine(isRegistered);
container.Register(Component.For<IFoo>().ImplementedBy<Foo>());
isRegistered = container.Kernel.HasComponent(typeof(IFoo));
Console.WriteLine(isRegistered);
这输出:
False
True
我有 ControllerFactory 的实现来处理控制器中的构造函数注入,但是我想使用默认方式来解析控制器,以防其中一些控制器未注册:
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IWindsorContainer _container;
public WindsorControllerFactory(IWindsorContainer container)
{
_container = container;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType != null)
{
try
{
return _container.Resolve(controllerType) as IController;
}
catch(Exception ex)
{
return base.GetControllerInstance(requestContext, controllerType);
}
}
else
{
return base.GetControllerInstance(requestContext, controllerType);
}
}
}
有效,但我真的很想避免异常
使用container.Kernel.HasComponent(Type type)
:
bool isRegistered;
var container = new WindsorContainer();
isRegistered = container.Kernel.HasComponent(typeof(IFoo));
Console.WriteLine(isRegistered);
container.Register(Component.For<IFoo>().ImplementedBy<Foo>());
isRegistered = container.Kernel.HasComponent(typeof(IFoo));
Console.WriteLine(isRegistered);
这输出:
False
True