【问题标题】:Determine if a given type can currently be resolved by a Castle Windsor container确定给定类型当前是否可以由 Castle Windsor 容器解析
【发布时间】:2010-03-10 16:25:06
【问题描述】:

我有一个场景,我需要知道特定类型当前是否可以由 Windsor 容器解析。皱纹是这种类型具有依赖性。所以我有一个实现IRefDataRepository 并依赖于IProductDataProviderProductRepository 类。我需要知道我是否可以从容器中成功解析IRefDataRepository

我尝试使用IKernel.HasComponent(typeof(IRefDataRepository)) IKernel.GetAssignableHandlers(typeof(IRefDataRepository)) 两者都返回ProductRepository,即使没有注册IProductDataProvider。 (所以IWindsorContainer.Resolve(typeof(IRefDataRepository))会抛出)

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

【问题讨论】:

    标签: c# castle-windsor


    【解决方案1】:

    你做错了。

    你应该把你的程序分成两个明确的部分:

    • 设置
    • 实际代码

    您在设置中注册内容,然后在您可以解决问题的地方运行实际代码。如果无法解决,则说明您的设置代码中有错误。

    第二部分的代码应该对容器没有任何了解,轮询容器是一大堆代码味道。

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

    【讨论】:

    • 这适用于发布的场景,但如果我使用带参数的工厂方法,它就不起作用。 handler.CurrentState 是有效的,但仍然无法解析,因为工厂方法无法获取所需的参数。
    • 我还要说所有这些代码都是 ASP.NET MVC 应用程序的设置端。我正在使用自定义控制器工厂,以便我可以使用 Windsor 来解决控制器依赖关系,并且我想知道哪些控制器会成功,哪些不会,所以我可以控制要注册的路由。我不想授予对不起作用的控制器的访问权限。
    • 那你做错了。您应该进行测试以确保您的控制器在注册时所有都已正确配置并可用。您想解决代码中的问题而不是修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多