我在Windsor初始化的构造函数中进行调试。我需要找到对windsor容器的引用,以使用以下代码行。
container.Resolve<IPerson>(new { id = 5 });
但我没有变量容器。 该解决方案有200个项目,我需要找到Windsor的起点。
调试此类问题的最先进技术是什么? 有没有办法找到.Resolve操作发生的源代码?
为了更好地澄清我的意思,其他类问题的解决方案是:
答案 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)
进入作文根 - &gt;类/工厂/决议开始的任何内容。
在主安装类中查找已注册的工厂。可能是一些实现IWindsorInstaller的类。如果您的项目很大,则可能有多个安装程序类用于应用程序的不同模块。在Core Installer中,您可能会找到Castle用来创建和提供整个对象图的部分的工厂。
用笔和纸仔细检查整个对象图,以便最大限度地减少调试过程中的猜测工作,而不是落入&#34; Shotgun调试&#34;这是详尽无遗的,最后你没有学到任何关于系统的知识。找到构造函数的参数来源。
将您的断点放在XXXfactories / factory methods / XXXtypeFactoryComponentSelectors中,并使用多个请求进行完整的调试循环。
有一个很好的调试会话:)