Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何调试windsor解析容器的位置?_C#_Debugging_Castle Windsor - Fatal编程技术网

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

C# 如何调试windsor解析容器的位置?,c#,debugging,castle-windsor,C#,Debugging,Castle Windsor,我在Windsor初始化的构造函数中调试。我需要找到对windsor容器的引用以使用以下代码行 container.Resolve<IPerson>(new { id = 5 }); container.Resolve(新的{id=5}); 但是我没有变量容器。 该解决方案有200个项目,我需要找到温莎的起点 调试此类问题的最新技术是什么? 有没有办法找到发生.Resolve操作的源代码 为了更好地阐明我的意思,其他类型问题的解决方案是: 查看调用堆栈 从Visual Stu

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

container.Resolve<IPerson>(new { id = 5 });
container.Resolve(新的{id=5});
但是我没有变量容器。 该解决方案有200个项目,我需要找到温莎的起点

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


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

  • 查看调用堆栈
  • 从Visual Studio启用不同的异常处理
  • 玩“仅我的代码”选项
  • 写入quickwatch Transaction.Current(这是一个随处可见的静态类)
  • 进入合成根->类/工厂/解析开始的任何地方

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

  • 用笔和纸仔细检查整个对象图,以尽量减少调试过程中的猜测工作,避免陷入“散弹枪调试”中,这是一个详尽的过程,最终您对系统一无所知。查找构造函数参数的来源

  • 将断点放在xxxFactorys/factory方法/XXXtypeFactoryComponentSelectors中,并通过几个请求完成一个完整的调试周期


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

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

    您应该使用容器可以为您解析所需组件这一事实;以下是一些方法:

    • IPerson
      参数添加到构造函数中,让它为您解析
      IPerson
      。如果解析是静态的(即始终使用相同的id),您可以告诉Windsor将服务解析为
    • 如果在构建构造函数时无法解析
      IPerson
      ,请解析对象中的
      IPersonFactory
      。这将获取一个整数并返回一个IPerson。这样,您仍然与容器分离,但可以加载所需的数据
    • 如果您确实需要使用容器(尽管您应该可以不使用容器),您可以在配置期间将
      IWindsorContainer
      服务注册到容器intance,并向构造函数添加
      IWindsorContainer
      参数;容器将可用于您的对象
    虽然很简单,但我真的不推荐最后一种方法;实际上并不建议让代码了解容器

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

    这就是为什么使用IoC容器的主要原因之一——为了保持代码的整洁并负责对象的创建

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

    Windsor从调用其构造函数的位置开始
    新建WindsorContainer()
    (请参阅)

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

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

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

    var controllerFactory = new WindsorControllerFactory(container.Kernel);
    ControllerBuilder.Current.SetControllerFactory(controllerFactory);
    
    有一个:

    所以
    \u container.Resolve(controllerName)
    是调用Resolve方法的地方。解析(构建、创建)控制器容器尝试使用有关已注册类型的信息解析其所有依赖项

    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);
        }
    }