C# 如何调试windsor解析容器的位置?
我在Windsor初始化的构造函数中调试。我需要找到对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
container.Resolve<IPerson>(new { id = 5 });
container.Resolve(新的{id=5});
但是我没有变量容器。
该解决方案有200个项目,我需要找到温莎的起点
调试此类问题的最新技术是什么?
有没有办法找到发生.Resolve操作的源代码
为了更好地阐明我的意思,其他类型问题的解决方案是:
- 查看调用堆栈
- 从Visual Studio启用不同的异常处理
- 玩“仅我的代码”选项
- 写入quickwatch Transaction.Current(这是一个随处可见的静态类)
有一个很好的调试会话:)Windsor不解析容器,因为您需要一个容器来将服务解析为组件。通常,容器是合成根,这意味着它负责创建您可能需要的所有组件。在代码中使用容器不是一个好主意,因为它将特定代码与应用程序的常规设置绑定在一起 您应该使用容器可以为您解析所需组件这一事实;以下是一些方法:
- 将
参数添加到构造函数中,让它为您解析IPerson
。如果解析是静态的(即始终使用相同的id),您可以告诉Windsor将服务解析为IPerson
- 如果在构建构造函数时无法解析
,请解析对象中的IPerson
。这将获取一个整数并返回一个IPerson。这样,您仍然与容器分离,但可以加载所需的数据IPersonFactory
- 如果您确实需要使用容器(尽管您应该可以不使用容器),您可以在配置期间将
服务注册到容器intance,并向构造函数添加IWindsorContainer
参数;容器将可用于您的对象IWindsorContainer
新建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);
}
}