2010-03-10 37 views
1

我有一个场景,我需要知道某个特定类型是否可以通过Windsor容器解决。皱纹是这种类型有依赖性。所以我有一个ProductRepository类实现IRefDataRepository和取决于IProductDataProvider。我需要知道我是否可以成功地从容器中解析IRefDataRepository确定是否可以通过Castle Windsor容器解决某个给定类型

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

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

回答

1

你做错了。

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

  • 设置
  • 实际代码

你注册的事情在安装,然后运行实际的代码,你可以解决的东西。如果你不能解决它,你的设置代码中有一个错误。

代码的第二部分应该没有关于容器的知识,并且对容器进行轮询是一种很大的代码味道。

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

+0

这适用于发布的场景,但如果我使用带参数的工厂方法,则不起作用。 handler.CurrentState是有效的,但仍然无法解析,因为工厂方法无法获取它所需的参数。 – 2010-03-10 20:24:37

+0

我也会说所有这些代码都是ASP.NET MVC应用程序的设置端。我正在使用自定义控制器工厂,以便我可以使用Windsor来解决控制器依赖关系,并且我想知道哪些控制器会成功,哪些不会提前,因此我可以控制要注册的路由。我不想让控制器无法访问。 – 2010-03-10 20:26:49

+0

你做错了。您应该测试以确保** all **您的控制器在您注册时已正确配置并可用。您想在代码中解决问题而不是解决问题。 – 2010-03-11 10:54:27

相关问题