如何调试windsor解析容器的位置

本文关键字:位置 windsor 何调试 调试 | 更新日期: 2024-10-19 16:08:42

我正在Windsor初始化的构造函数中进行调试。我需要找到windsor容器的参考,才能使用以下代码行。

container.Resolve<IPerson>(new { id = 5 });

但我没有变量容器。解决方案有200个项目,我需要找到温莎的起点。

哪种技术是调试此类问题的最先进技术?是否有一种方法可以找到.Resolve操作发生的源代码?


为了更好地阐明我的意思,其他类别问题的解决方案是:

  • 查看调用堆栈
  • 从Visual Studio启用不同的异常处理
  • 使用"仅我的代码"选项
  • 在quickwatchTransaction.Current中写入(这是一个随处可见的静态类)

如何调试windsor解析容器的位置

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方法的地方。解析(构建、创建)控制器容器尝试使用有关注册类型的信息来解析其所有依赖项。

  1. 进入Composition Root->解析开始的类/工厂/任何东西。

  2. 在主安装类中查找已注册的工厂。可能是实现IWindsorInstaller的某个类。如果你的项目那么大,你可能会为应用程序的不同模块有多个安装程序类。在Core安装程序中,您可能会找到Castle用来创建和提供整个对象图的部分的工厂。

  3. 用笔和纸仔细检查整个对象图,以最大限度地减少调试过程中的猜测工作,而不是陷入"Shotgun调试",这是详尽无遗的,最终您对系统一无所知。查找构造函数的参数来源。

  4. 将您的断点放在XXXfactory/factory-methods/XXXtypeFactoryComponentSelectors中,并使用多个请求进行完整的调试周期。

有一个很好的调试会话:)