繁体   English   中英

不同的ASP.NET MVC组件中的对象范围和生命周期是什么?

[英]What is the object scope and lifetime in the different ASP.NET MVC components?

ASP.NET MVC有许多组件。 控制器,动作,静态类,ApiControllers,过滤器,RouteTables,BundleTables,工厂等,以及控制器范围的访问修饰符。

如果我们实例化一个对象或访问其中任何一个中的静态属性,我们如何确定对象,类或成员的范围和生命周期。 以这个例子为例:

public static class MyHelper
{
    public static object MyProperty { get; set; }
    public static Func<object> MyPropertyFactory { get; set; }

    static MyHelper()
    {
        MyProperty = new object();
        MyPropertyFactory = () => new object();
    }
}
public class MyController : ApiController
{
    public object MyAppProperty { get; set; }
    public object MyRequestProperty { get; set; }

    public MyController()
    {
        MyAppProperty = MyHelper.MyProperty;
        MyRequestProperty = MyHelper.MyPropertyFactory;
    }

    public object MyAction()
    {
        var MyActionObject = new object();
        return MyActionObject;
    }
}

我发现难以解析不同对象和静态类属性的生命周期和范围。 这让我陷入线程和其他问题。

除了分析和经验,是否有一个通常的过程来确定这个? 另一个更可回答的问题是:“以下各项的生命周期和范围是什么?为什么?

  • MyHelper
  • MyHelper.MyProperty
  • MyHelper.MyPropertyFactory
  • myController的
  • MyController.MyAppProperty
  • MyController.MyRequestProperty
  • MyController.MyAction.MyActionObject

所有静态属性都具有AppDomain生命周期(从第一次使用到关闭/重新启动)。

其他(控制器,模型和视图) - 请求生命周期(在请求期间创建,在该请求结束后符合GC条件)。

我可以建议使用Dependency Injection容器。 终身范围的问题将消失,因为容器将为您管理所有这些问题。

而不是静态启动和搞乱函数工厂,你会做:

private readonly IService service;
private readonly IOtherService otherService;

public MyController(IService service, IOtherService)
{
    this.service = service;
    this.otherService = otherService;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM