我如何调试windsor解决容器的位置?

时间:2015-03-06 17:28:44

标签: c# debugging castle-windsor

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

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

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

调试此类问题的最先进技术是什么? 有没有办法找到.Resolve操作发生的源代码?


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

  • 查看电话堆栈
  • 从Visual Studio启用不同的异常处理
  • 使用Just My code选项
  • 写在quickwatch Transaction.Current(这是一个可见的静态类)

3 个答案:

答案 0 :(得分:1)

Windsor无法解析容器,因为您需要一个容器来解析组件的服务。通常,容器是组合根,这意味着它主持创建您可能需要的所有组件。在代码中使用容器不是一个好主意,因为它将特定代码与应用程序的常规设置联系起来。

您应该使用容器可以为您解决所需组件的事实;这是方法:

  • 在构造函数中添加IPerson参数,让它为您解析IPerson。如果分辨率是静态的(即始终具有相同的ID),您可以告诉Windsor将服务解析为specific instance
  • 如果在构建构建器时无法解析IPerson,请解析对象中的IPersonFactory。这个factory将取一个整数并返回一个IPerson。这样您仍然可以与容器分开,但是您可以加载所需的数据。
  • 如果您确实需要使用容器(尽管您应该没有),您可以在配置期间将IWindsorContainer服务注册到容器intance并向构造函数添加IWindsorContainer参数;容器将可用于您的对象。

虽然很简单,但我真的不推荐最后一种方法;不建议您的代码知道容器

答案 1 :(得分:1)

  

我在Windsor初始化的构造函数中进行调试。 ... 但是我   没有变量容器。

这是使用IoC容器的主要原因之一 - 为了保持代码清洁并负责创建对象。

  

该解决方案有200个项目,我需要找到Windsor的起点。

Windsor从调用其构造函数new WindsorContainer()开始(参见Bootstrapping Windsor)。

container = new WindsorContainer()
    .Install(FromAssembly.This());

对于MVC Web应用程序,您可以在Global.asax.cs中找到这些代码行。

  

有没有办法找到.Resolve操作所在的源代码   会发生什么?

e.g。对于MVC Web应用程序,它发生在自定义控制器工厂中,该工厂在Global.asax.cs

中初始化
var controllerFactory = new WindsorControllerFactory(container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);

有一个example of custom controller factory implementation

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

答案 2 :(得分:0)

  1. 进入作文根 - &gt;类/工厂/决议开始的任何内容。

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

  3. 用笔和纸仔细检查整个对象图,以便最大限度地减少调试过程中的猜测工作,而不是落入&#34; Shotgun调试&#34;这是详尽无遗的,最后你没有学到任何关于系统的知识。找到构造函数的参数来源。

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

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