C# 确定给定类型当前是否可以由Castle Windsor容器解析

C# 确定给定类型当前是否可以由Castle Windsor容器解析,c#,castle-windsor,C#,Castle Windsor,我有一个场景,需要知道特定类型当前是否可以由Windsor容器解析。问题在于这种类型具有依赖性。因此,我有一个ProductRepository类,它实现了IRefDataRepository,并且依赖于IProductDataProvider。我需要知道是否可以从容器中成功解析IRefDataRepository 我尝试使用IKernel.HasComponent(typeof(IRefDataRepository))IKernel.GetAssignableHandlers(typeof(I

我有一个场景,需要知道特定类型当前是否可以由Windsor容器解析。问题在于这种类型具有依赖性。因此,我有一个
ProductRepository
类,它实现了
IRefDataRepository
,并且依赖于
IProductDataProvider
。我需要知道是否可以从容器中成功解析
IRefDataRepository

我尝试使用
IKernel.HasComponent(typeof(IRefDataRepository))
IKernel.GetAssignableHandlers(typeof(IRefDataRepository))
这两个函数返回
ProductRepository
,即使没有注册
IProductDataProvider
。(因此
IWindsorContainer.Resolve(typeof(IRefDataRepository))
将抛出)

我当前的解决方案是编写一个扩展方法,该方法实际尝试解析类型(通过
IWindsorContainer.resolve(IRefDataRepository)
),捕获异常,如果类型解析,则返回true,否则返回false。但是我想知道是否有更好的办法。

你做错了

您应该将程序分为两个明确的部分:

  • 设置
  • 实际代码
您可以在安装程序中注册内容,然后运行实际代码,在其中可以解析内容。如果无法解决此问题,则说明安装代码中存在错误

代码的第二部分应该不了解容器,而轮询容器是一个很大的代码问题

话虽如此,当您出于某种原因必须这样做时,为您需要的组件获取一个处理程序,并检查它的状态(
handler.CurrentState
)。如果
有效
则可以安全地解析组件相反并不一定是真的你做错了

您应该将程序分为两个明确的部分:

  • 设置
  • 实际代码
您可以在安装程序中注册内容,然后运行实际代码,在其中可以解析内容。如果无法解决此问题,则说明安装代码中存在错误

代码的第二部分应该不了解容器,而轮询容器是一个很大的代码问题


话虽如此,当您出于某种原因必须这样做时,为您需要的组件获取一个处理程序,并检查它的状态(
handler.CurrentState
)。如果
有效
则可以安全地解析组件相反并不一定是真的

这适用于发布的场景,但如果使用带参数的工厂方法,则不起作用。handler.CurrentState是有效的,但它仍然无法解析,因为factory方法无法获取它所需的参数。我还想说,所有这些代码都是ASP.NET MVC应用程序的安装端。我正在使用一个自定义控制器工厂,这样我就可以使用Windsor来解决控制器依赖关系,我想知道哪些控制器会成功,哪些不会成功,这样我就可以控制要注册的路由。我不想让你访问无法工作的控制器。那你就做错了。您应该进行测试,以确保所有控制器在注册时都已正确配置并可用。您希望解决代码中的问题,而不是修复它。这适用于发布的场景,但如果使用带参数的工厂方法,则不起作用。handler.CurrentState是有效的,但它仍然无法解析,因为factory方法无法获取它所需的参数。我还想说,所有这些代码都是ASP.NET MVC应用程序的安装端。我正在使用一个自定义控制器工厂,这样我就可以使用Windsor来解决控制器依赖关系,我想知道哪些控制器会成功,哪些不会成功,这样我就可以控制要注册的路由。我不想让你访问无法工作的控制器。那你就做错了。您应该进行测试,以确保所有控制器在注册时都已正确配置并可用。您希望解决代码中的问题,而不是修复它。