如何调试windsor解析容器的位置
本文关键字:位置 windsor 何调试 调试 | 更新日期: 2024-10-19 16:08:42
我正在Windsor初始化的构造函数中进行调试。我需要找到windsor容器的参考,才能使用以下代码行。
container.Resolve<IPerson>(new { id = 5 });
但我没有变量容器。解决方案有200个项目,我需要找到温莎的起点。
哪种技术是调试此类问题的最先进技术?是否有一种方法可以找到.Resolve操作发生的源代码?
为了更好地阐明我的意思,其他类别问题的解决方案是:
- 查看调用堆栈
- 从Visual Studio启用不同的异常处理
- 使用"仅我的代码"选项
- 在quickwatchTransaction.Current中写入(这是一个随处可见的静态类)
Windsor不解析容器,因为您需要一个容器来将服务解析为组件。通常容器是组合根,这意味着它负责创建您可能需要的所有组件。在代码中使用容器不是一个好主意,因为它将特定代码与应用程序的常规设置联系在一起。
您不应该使用容器可以为您解析所需组件的事实;这里有一些方法:
- 在构造函数中添加一个
IPerson
参数,让它为您解析IPerson
。如果解析是静态的(即总是相同的id),您可以告诉Windsor将服务解析到特定实例 - 如果在构建构造函数时无法解析
IPerson
,请解析对象中的IPersonFactory
。此工厂将获取一个整数并返回一个IPerson。通过这种方式,您仍然与容器分离,但您可以加载所需的数据 - 如果你真的需要使用容器(尽管你应该可以不使用),你可以在配置期间将
IWindsorContainer
服务注册到容器中,并向你的构造函数添加IWindsorContainer
参数;该容器将可用于您的对象
虽然它很简单,但我真的不推荐最后一种方法;让您的代码了解容器并不是真正推荐的
我正在Windsor初始化的构造函数中调试。。。但是我没有变量容器。
这就是使用IoC容器的主要原因之一——为了保持代码的干净并负责对象的创建。
解决方案有200个项目,我需要找到温莎的起点。
Windsor从调用其构造函数new WindsorContainer()
的位置开始(请参阅引导Windsor)。
container = new WindsorContainer()
.Install(FromAssembly.This());
对于MVC web应用程序,您可以在Global.asax.cs
中找到这些代码行。
有没有一种方法可以找到.Resove操作所在的源代码发生了什么?
例如,对于MVC web应用程序,它发生在Global.asax.cs
中初始化的自定义控制器工厂中
var controllerFactory = new WindsorControllerFactory(container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
有一个自定义控制器工厂实现的例子:
public class WindsorControllerFactory : IControllerFactory
{
private readonly WindsorContainer _container;
public WindsorControllerFactory(WindsorContainer container)
{
_container = container;
}
public IController CreateController(RequestContext requestContext, string controllerName)
{
return (IController)_container.Resolve(controllerName);
}
public void ReleaseController(IController controller)
{
_container.Release(controller);
}
}
所以_container.Resolve(controllerName)
是调用Resolve方法的地方。解析(构建、创建)控制器容器尝试使用有关注册类型的信息来解析其所有依赖项。
-
进入Composition Root->解析开始的类/工厂/任何东西。
-
在主安装类中查找已注册的工厂。可能是实现IWindsorInstaller的某个类。如果你的项目那么大,你可能会为应用程序的不同模块有多个安装程序类。在Core安装程序中,您可能会找到Castle用来创建和提供整个对象图的部分的工厂。
-
用笔和纸仔细检查整个对象图,以最大限度地减少调试过程中的猜测工作,而不是陷入"Shotgun调试",这是详尽无遗的,最终您对系统一无所知。查找构造函数的参数来源。
-
将您的断点放在XXXfactory/factory-methods/XXXtypeFactoryComponentSelectors中,并使用多个请求进行完整的调试周期。
有一个很好的调试会话:)