【问题标题】:What is the object scope and lifetime in the different ASP.NET MVC components?不同 ASP.NET MVC 组件中的对象范围和生命周期是什么?
【发布时间】:2014-01-25 22:27:06
【问题描述】:

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.MyProperty
  • MyHelper.MyPropertyFactory
  • 我的控制器
  • MyController.MyAppProperty
  • MyController.MyRequestProperty
  • MyController.MyAction.MyActionObject

【问题讨论】:

    标签: c# asp.net asp.net-mvc scope lifetime


    【解决方案1】:

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

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

    【讨论】:

    • 这就是答案,因为它给出了一个简洁明了的答案。我想知道,“什么是 AppDomain 生命周期,什么是请求生命周期,还有其他生命周期类别。”从您的回答看来,AppDomain 和 Request 似乎是仅有的两个生命周期类别。对吗?
    • @ShaunLuttin AppDomain 和请求生命周期是 ASP.Net 应用程序最有趣的两个案例。实际上,您可以获得更详细的估计(即在创建相应视图之前控制器已消失),但对于大多数实际目的而言,这两个就足够了(即知道某些东西是否会在下一个请求中存活)。
    【解决方案2】:

    我可以建议使用依赖注入容器。您的生命周期范围问题将消失,因为容器将为您管理所有这些。

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

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

    【讨论】:

    • 这个 blog post 和 VS 2013 中的 ASP.NET MVC Identity 模板代码是我提出问题的原因。我喜欢并使用依赖注入。在 Identity 博客文章中,Microsoft 使用并推荐了工厂模式,“这是针对应用程序的每个请求获取 UserManager 实例的推荐方式。”值得注意的是,他们说这是“推荐的方式”而不是“推荐的方式”。也许依赖注入是一个更好的模型。你有什么想法?
    • 许多 Microsoft 示例忽略 DI 容器,只是根据需要生成新对象。我会用一点盐来接受这个建议。另外我会研究工厂的源代码并检查它是否真的控制了创建对象的生命周期。
    • 所以要明确一点,这些注入服务的寿命超过 1 个请求?
    • @Lawyerson 这取决于您的 DI 的配置方式。通常建议将请求作为生命范围,即在每个请求上重新创建对象,但您可以拥有其他生命范围,例如单例。
    • DI 容器是否在每次请求时都创建一个新的控制器实例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    相关资源
    最近更新 更多