【问题标题】:What is the alternative to Static Class in asp.net mvc 4?asp.net mvc 4中静态类的替代方法是什么?
【发布时间】:2013-07-18 08:45:00
【问题描述】:

seen here 认为静态类和静态函数不好,因为它们占用大量内存。

我将它用于许多需要与数据库交互等的事情。

这个静态本地化类的一部分的例子,GetResources

public static class SFLocalization
{

    public static string GetResources(string key)
    {
          string CurrentLanguage = System.Threading.Thread.CurrentThread.CurrentUICulture.ToString();
          if (MemoryCache.Default["Resources_" + key] == null)
          {
          string x 
          using (Db _db = new Db())
            {
                MemoryCache.Default["Resources_" + key] = _db.Languages.First(l => l.Key == key && l.LanguageCode == CurrentThread).Value;
            }
          }
          return MemoryCache.Default["Resources_" + key];
    }
}

然后在视图中,控制器等。我只写这个来获取翻译后的值

 @SFLocalization.GetResources("NewsletterBoxTitle")

1.) 在这些情况下,静态类真的那么糟糕吗?

2.) 有什么替代方法?也许是依赖注入(ninject 等)?? (我在 Apress - Pro Asp.net Mvc 4 一书中看到过

【问题讨论】:

  • 我想你忘了把“这里”(在“我看到 这里 静态类和静态函数不好......”)链接。你到底指的是什么?
  • “我在这里看到静态类和静态函数很糟糕,因为它们占用大量内存。” 这不是真的。
  • 静态类不太好,因为它们不容易被模拟。使用 IoC,您可以将单个实例公开为单例,但是您仍然可以控制该对象。这样你就可以将它们模拟成类,因为它们是一个依赖项。
  • static class members are never GC'd 开始,我部分同意你,但我永远不会同意static functions take lot of memory。函数是否占用内存(如果仅声明局部变量,它也会在超出范围后很快被 GC 处理)?这个说法是错误的!
  • 那么,用静态类取翻译文本好不好?

标签: c# asp.net asp.net-mvc-3 asp.net-mvc-4 dependency-injection


【解决方案1】:

静态类(或模块)通常是域或应用程序服务的替代品。将此服务公开为静态类通常很方便,以便可以从任何地方访问它 - 如果它是诸如本地化之类的横切关注点,则尤其如此。

这种方法可以让您快速启动并运行,但它确实存在一些问题。能够随时随地访问服务会鼓励糟糕的编码实践,并且很容易导致意大利面条式代码。静态模块也使得使用它们的类很难进行单元测试。随着项目规模的扩大,这两个问题都会呈指数级增长 - 所以尽快解决它们通常是个好主意。

正如您在问题中提到的,依赖注入是确保类可以访问服务的一种方法,而不是使其成为静态/全局的。

【讨论】:

  • 在这篇文章中查看“Jason De Oliveira”的答案stackoverflow.com/questions/11128750/…
  • @DanielEzra 你的问题是那个问题的重复吗?
  • 不是,但他们说:“静态对象被认为是应用程序的根,不会被垃圾收集。”
  • @DanielEzra 没错,静态模块没有资格进行垃圾收集,并且在 appdomain 关闭之前不会被卸载。我不明白这有什么关系?
  • 我的意思是——静态对象需要的对象实例既不多也不少。唯一的区别是它们在内存中的停留时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2010-12-25
  • 1970-01-01
  • 2013-08-08
  • 2013-08-08
  • 2011-07-22
  • 1970-01-01
相关资源
最近更新 更多