【问题标题】:Create static singleton instance different for each user为每个用户创建不同的静态单例实例
【发布时间】:2014-08-11 09:49:00
【问题描述】:

我正在使用 ASP.NET MVC 开发一个网站,我有很多这样的说明:

new ReleaseFactory().BuildFeatureSection();

为了改进我认为使用静态方法的代码:

ReleaseFactory.BuildFeatureSection()

问题是我害怕发生死锁的可能性。

这些方法经常访问不同的数据源(如 Excel 文档、数据库等),据我所知,通过静态方法访问它们并不是一个好主意,尤其是在开发 Web 应用程序时。

有什么好主意可以改进当前的语法吗?

编辑:有关 Release Factory 用途的更多信息。

ReleaseFactory 是一个用于为发布页面创建 ViewModel 的类。显示的数据不是基于登录的用户,而是对每个人都是一样的。在我的网站中,还有其他带有构造函数的工厂,通常只需要一个参数。

例如:{baseUrl}/Feature/{ID}

public ActionResult BetaProgram(int id)
{  
       var viewModel = new FeatureFactory(id).BuildFeatureViewModel();

       return View(viewModel);
}

同样在这种情况下显示的信息不是基于用户,而只是基于当前页面的 id。希望这有助于更好地了解情况。

【问题讨论】:

  • “改进代码” - 怎么样?你想解决什么问题?在我看来,您是在添加问题而不是解决问题。
  • ThreadStaticAttribute 如果每个用户都有单独的线程
  • @DmitryBychenko“线程”在 ASP.NET 应用程序中几乎从来都不是“用户”的同义词。
  • 你的问题是有效的,但标题确实让我失望。
  • @dcastro - 这就是为什么他说“如果每个用户都有一个单独的线程”

标签: c# asp.net-mvc web static singleton


【解决方案1】:

如果没有看到您的代码,我最好的建议是使用锁定,例如

public static class Foo
{
    private static object lockingObject = new object();

    public static void DoSomething()
    {
        lock (lockingObject)
        {
            // Do your stuff.
        }
    }
}

这是一个简单的例子,可能对你来说就足够了,不确定。基本上,您一次阻止访问lock 语句中运行的代码到一个线程。这可以消除死锁,因为一次只有一个线程可以执行lock 语句中的代码。

你最好试试这个,如果你有工具,对代码做一些负载测试,看看有什么问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多