【问题标题】:Static Initialization Design Ideas静态初始化设计思路
【发布时间】:2012-02-23 10:01:03
【问题描述】:

目前,我的 MVC 3 应用程序依赖于在 Application_Start() 中初始化的静态类,如下所示:

protected void Application_Start()
{
    MyDependency.Initialize();
}

静态类看起来或多或少类似于以下内容:

public static class MyDependency
{
    public static void Initialize()
    {
        // Perform some I/O...
    }
}

这个依赖用在一个属性类中,它带有没有运行时依赖的警告(因此在 Application_Start() 中调用初始化)

public class MyAttributeClass : ...
{
    public MyAttributeClass()
    {
        MyDependency.DoSomething(); //...
    }
}

最终,我们商店的其他开发人员将不得不使用此 API,我想看看是否有办法摆脱 Application_Start() 中的行(Global.asax 中的额外代码行很可能是被遗忘的一步)

例如,有没有一种方法可以将 MyDependency 类“挂钩”到管道中而无需编辑 Global.asax?

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 static custom-attributes


    【解决方案1】:

    在MyDependency 中使用静态构造函数。 Here's MSDN 解释静态构造函数提供的功能。

    通过使用静态构造函数,您应该能够执行您需要的所有 IO,因为构造函数将在访问任何静态成员之前运行。

    【讨论】:

    • 是的,它做到了。我有一种(错误的)印象,即在第一次使用静态类时调用了静态构造函数。 MSDN 文章澄清了一些事情。谢谢
    • 这当然有效。但是,要非常小心,您的静态构造函数不会抛出任何异常,因为这会产生令人讨厌的后果。请参阅stackoverflow.com/a/4737910/117625 以及上述答案的 MSDN 链接中的警告。
    【解决方案2】:

    您应该查看WebActivator。来自the wiki:

    WebActivator 是一个 NuGet 包,它允许其他包轻松 将启动和关闭代码引入 Web 应用程序。这给 比修改 global.asax 更干净的解决方案 许多包的启动逻辑。

    基本上,您需要以下内容:

    using System;
    
    [assembly: WebActivator.PreApplicationStartMethod(typeof(MyDependency), "Initialize")]
    public static class MyDependency
    {
        public static void Initialize()
        {
            // Perform some I/O...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 2011-01-26
      • 2020-02-05
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多