C# 温莎集装箱。ASP.NET MVC应用程序中对象的生存期
我有一个新项目,国际奥委会使用温莎集装箱 下面是在Install中执行的简化代码C# 温莎集装箱。ASP.NET MVC应用程序中对象的生存期,c#,asp.net,castle-windsor,C#,Asp.net,Castle Windsor,我有一个新项目,国际奥委会使用温莎集装箱 下面是在Install中执行的简化代码 public void Install(IWindsorContainer container, IConfigurationStore store) { container.Register(Classes.FromThisAssembly().BasedOn<BaseController>().LifestyleTransient(), Com
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly().BasedOn<BaseController>().LifestyleTransient(),
Component.For<ISecurityManager>().ImplementedBy<SecurityManager>(),
Component.For<IAccountManager>().ImplementedBy<AccountManager>()
........)
}
public void安装(IWindsorContainer,IConfigurationStore)
{
container.Register(Classes.fromthissembly().BasedOn().LifestyleTransient(),
Component.For().ImplementedBy(),
Component.For().ImplementedBy()实现
........)
}
我在官方文件中找到的信息不足以详细理解这些行
Classes.FromThisAssembly().BasedOn<BaseController>().LifestyleTransient(),
Classes.fromthissembly().BasedOn().LifestyleTransient(),
寄存器中的这一行方法可以将依赖项注入到从BaseController继承的应用程序中的所有类
包括BaseController
除上述情况外,不得对其他类别进行注射
我们向容器显示所有控制器类的生存期都是一个实例
Component.For<ISecurityManager>().ImplementedBy<SecurityManager>()
Component.For().ImplementedBy()实现
对于上面注册的所有控制器,若它们在构造函数接口中有ISecurityManager,则将注入类SecurityManager的实例
此SecurityManager的生存期作为默认值为singleton。因此,在应用程序启动之后,在应用程序执行结束之前,所有控制器都只有一个SecurityManager实例
我的想法正确吗?似乎不是,至少因为控制器的Lifestyle Transient()在我看来很奇怪,而且注入的对象也将是单例对象。从下到上: 此SecurityManager的生存期作为默认值为singleton。因此,在应用程序启动之后,在应用程序执行结束之前,所有控制器都只有一个SecurityManager实例 这一切都会发生 似乎不是,至少因为控制器的Lifestyle Transient()在我看来很奇怪,而且注入的对象也将是单例对象 控制器是暂时的,因为它们持有HttpContext——它们拥有关于当前用户请求和以下响应的信息。这就是为什么它们是瞬态的,而不是单例的——HttpContext是每个请求的,每次浏览器/客户端请求某个内容时都会创建它 因此,可以理解为什么控制器的寿命比其他服务短。这在很大程度上取决于应用程序的内部架构。如果其他人有更好的想法,为什么-我非常愿意学习 通过创建自定义控制器工厂并替换默认值,可以完成控制器的注册/解析/释放周期:
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel;
public WindsorControllerFactory(IKernel kernel)
{
_kernel = kernel;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
}
if (_kernel.GetHandler(controllerType) != null)
{
return (IController)_kernel.Resolve(controllerType);
}
return base.GetControllerInstance(requestContext, controllerType);
}
public override void ReleaseController(IController controller)
{
_kernel.ReleaseComponent(controller);
}
}
在某处:
container.Register(Component.For<IControllerFactory>().ImplementedBy<WindsorControllerFactory>());
container.Register(Component.For().ImplementedBy());
我的控制器也有单例依赖项。通过这种方式,您可以实现一个管道编程模型——您将来自控制器的请求通过一系列对象传递,然后返回结果
如果SecurityManager与身份验证或授权有关,那么最好使用MVC默认机制,如或。当然,这可能是数据访问过滤器,将其放在不同的对象中可能是合理的
我回答你的问题了吗?自下而上: 此SecurityManager的生存期作为默认值为singleton。因此,在应用程序启动之后,在应用程序执行结束之前,所有控制器都只有一个SecurityManager实例 这一切都会发生 似乎不是,至少因为控制器的Lifestyle Transient()在我看来很奇怪,而且注入的对象也将是单例对象 控制器是暂时的,因为它们持有HttpContext——它们拥有关于当前用户请求和以下响应的信息。这就是为什么它们是瞬态的,而不是单例的——HttpContext是每个请求的,每次浏览器/客户端请求某个内容时都会创建它 因此,可以理解为什么控制器的寿命比其他服务短。这在很大程度上取决于应用程序的内部架构。如果其他人有更好的想法,为什么-我非常愿意学习 通过创建自定义控制器工厂并替换默认值,可以完成控制器的注册/解析/释放周期:
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel;
public WindsorControllerFactory(IKernel kernel)
{
_kernel = kernel;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
}
if (_kernel.GetHandler(controllerType) != null)
{
return (IController)_kernel.Resolve(controllerType);
}
return base.GetControllerInstance(requestContext, controllerType);
}
public override void ReleaseController(IController controller)
{
_kernel.ReleaseComponent(controller);
}
}
在某处:
container.Register(Component.For<IControllerFactory>().ImplementedBy<WindsorControllerFactory>());
container.Register(Component.For().ImplementedBy());
我的控制器也有单例依赖项。通过这种方式,您可以实现一个管道编程模型——您将来自控制器的请求通过一系列对象传递,然后返回结果
如果SecurityManager与身份验证或授权有关,那么最好使用MVC默认机制,如或。当然,这可能是数据访问过滤器,将其放在不同的对象中可能是合理的
我回答你的问题了吗