C# 温莎集装箱。ASP.NET MVC应用程序中对象的生存期

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

我有一个新项目,国际奥委会使用温莎集装箱

下面是在Install中执行的简化代码

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默认机制,如或。当然,这可能是数据访问过滤器,将其放在不同的对象中可能是合理的

我回答你的问题了吗