如何在c#中创建一个完美的Singleton类?

2024-04-19

我想用 Singleton 类存储一些数据。据我研究,单例类只能实例化一次。但这对我不起作用。有人可以更正我的代码吗:

public class MvcApplication : System.Web.HttpApplication
    {
        Singleton clientsessionidinstance = Singleton.GetInstance();
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }


        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new string[] { "MVCPrj.Controllers" }
            );
        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            LOGICcLASSES.Logic.Auth ca = new LOGICcLASSES.Logic.Auth();
            clientsessionidinstance = Singleton.GetInstance();
            clientsessionidinstance.ClientSessionID = ca.Login(new LOGICcLASSES.Entities.ClientAuthentication()
            {
                IP = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"],
                UserName = ConfigurationManager.AppSettings["ClientUserName"],
                Password = ConfigurationManager.AppSettings["ClientPassword"]
            });
        }

        protected void Application_AcquireRequestState(object sender, EventArgs e)
        {
            if (System.Web.HttpContext.Current.Session != null)
            {
                if (!string.IsNullOrEmpty(clientsessionidinstance.ClientSessionID))
                {
                    CurrentUserSession.Store<string>("ClientSessionID", clientsessionidinstance.ClientSessionID);
                }
            }
        }
    }  

所以目标是这样的,@Application_Start我必须登录一个帐户。然后我应该将返回字符串保存在HttpContext.Current.Session.
不幸的是我无法访问HttpContext.Current.Session inside Application_Start但有可能Application_AcquireRequestState.
我可以使用一个变量来保存返回的字符串,然后在Application_AcquireRequestState,但最大的问题是,页面加载了吗?两次,所以如果我使用一个变量,它将变成null在第二次加载时但是Application_Start仍然启动一次。
所以我想出了使用 Singleton 类,但在第二次加载时我仍然得到空值。

单例类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MVCPrj.Areas.WebPage.Logic
{
    public class Singleton
    {
        private static Singleton instance;

        private Singleton() { }

        public static Singleton GetInstance()
        {
            lock (typeof(Singleton))
            {
                instance = new Singleton();
            }
            return instance;
        }

        private string _ClientSessionID;
        public string ClientSessionID
        {
            get { return _ClientSessionID; }
            set { _ClientSessionID = value; }
        }
    }
}  

EDIT

阅读后这段代码对我有用辛格尔顿 http://geekswithblogs.net/BlackRabbitCoder/archive/2010/05/19/c-system.lazylttgt-and-the-singleton-design-pattern.aspx

public class Singleton
{
    private static readonly object _mutex = new object();
    private static volatile Singleton _instance = null;
    private Singleton() { }

    public static Singleton Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_mutex)
                {
                    if (_instance == null)
                    {
                        _instance = new Singleton();
                    }
                }
            }
            return _instance;
        }
    }

    private string _ClientSessionID;
    public string ClientSessionID
    {
        get { return _ClientSessionID; }
        set { _ClientSessionID = value; }
    }
}

如果您使用 .NET4,“完美单例”通常最好使用系统惰性 http://geekswithblogs.net/BlackRabbitCoder/archive/2010/05/19/c-system.lazylttgt-and-the-singleton-design-pattern.aspx.

也可以看看这个网页 http://csharpindepth.com/articles/general/singleton.aspx有关 C# 中许多不同单例模式及其各种优缺点的描述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在c#中创建一个完美的Singleton类? 的相关文章

  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 为什么极端下派生类(多重虚拟继承)的大小包括超类成员大小的两倍?

    include
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且

随机推荐

  • 添加应用程序时 Firebase 数据库被删除

    好的 所以我正在构建一个将在 Play 商店上运行的应用程序 它具有将数据添加到 Firebase 的功能 它无法读取数据 第二个应用程序将保留在我身边 它不会出现在游戏商店中 它用于读取数据 现在我所做的是 假设第一个应用程序有包名称 c
  • 有目的地回到之前的活动

    我有两个活动 当我在第一个活动上按 Enter 时 它将打开第二个活动 它包含一个ListView当我从中选择一个项目时ListView 它将获得其值并返回到第一个活动 这就是我尝试过的 在第二项活动中 listPerasat setOnI
  • R:随机采样抛硬币组

    我正在使用 R 编程语言 Suppose 有一枚硬币 如果它正面朝上 那么下一次抛掷正面的概率是 0 6 如果是反面 那么下一次抛掷反面的概率也是 0 6 一个班有100名学生 每个学生随机抛掷硬币几次 Student n 的最后一次抛硬币
  • Iframe/CSS:强制 Iframe 适合屏幕

    我目前正在尝试让 iframe 适合我的屏幕尺寸 以及任何其他以不同分辨率使用它的用户 除非无论我尝试什么 最终都会导致 iframe 太小或高度太大导致双滚动条 iframe 和页面本身有滚动条 我的目标是让 iframe 仅适合页面宽度
  • CUDA程序导致nvidia驱动程序崩溃

    当我超过大约 500 次试验和 256 个完整块时 我的 monte carlo pi 计算 CUDA 程序导致我的 nvidia 驱动程序崩溃 这似乎发生在 monteCarlo 内核函数中 任何帮助都会受到赞赏 include
  • IMAP fetch() 返回命令错误:BAD [b' 命令参数错误。 12']

    我无法在网上找到示例 故障排除提示 并且不太确定我是否正确解释了文档 任何帮助将不胜感激 我正在连接到电子邮件服务器 并且想要阅读电子邮件主题和正文 我首先像这样建立连接 import imaplib c imaplib IMAP4 SSL
  • 如何在 Ruby 中使用模块重写静态类方法?

    module Imodule end class Some include Imodule def self imethod puts original end end Some imethod gt overrided 如何创建一个将覆盖
  • acts_as_taggable_on:如何优化查询?

    I use acts as taggable on在我当前的 Rails 项目中 在一个概述页面上 我显示了对象及其关联标签的索引 我使用以下代码 class Project lt ActiveRecord Base acts as tag
  • “Windows”键作为快捷键的一部分

    I very often open a console window while doing my development Usually Win R gt cmd gt enter However Windows also lets yo
  • 从 Android 中的“我的应用程序”发送彩信

    我想将彩信从我的应用程序发送到特定号码 我已经搜索并找到了这段代码 但我不知道这段代码是否是我需要的 我的问题是 任何人都可以向我解释这段代码 我是彩信初学者 另外 我认为这段代码是让用户从我的应用程序发送彩信 而不将其移动到本机消息收件箱
  • OpenCV GPU Farneback 光流在多线程中表现不佳

    我的应用程序使用 Opencv GPU 类gpu FarnebackOpticalFlow计算输入视频的一对连续帧之间的光流 为了加速该过程 我利用 OpenCV 的 TBB 支持在多线程中运行该方法 然而 多线程性能并不像单线程那样 为了
  • 如何在 iOS 中检查产品是否已使用应用内购买进行购买?

    我有一个应用程序集成在其中的应用程序 在我的应用程序中 我有两个用于付费应用程序购买和订阅的按钮 当用户点击 购买 时 它会检查苹果验证并购买产品 这可以正常工作 但是当购买产品时 我的购买按钮应该更改为 完成 并且当应用程序下次运行时 该
  • 同时对两个 arrayList 进行排序

    假设我有两个 ArrayList name Four Three One Two num 4 3 1 2 如果我这样做 Arrays sort num 那么我有 name Four Three One Two num 1 2 3 4 有什么
  • 撤消 git merge 到远程分支

    长话短说 我正在处理一个远程分支 my remote branch 但它在 CI 中的一些测试失败了 我被告知要重新建立 master 来解决这个问题 我做了以下事情 git checkout master git pull git che
  • R:用 gsub 替换“+”字符

    这个问题似乎完全微不足道 但我不明白为什么它不起作用 我只是想将涉及 运算符的字符变量替换为不包括 运算符的单个值 由于某种原因 gsub 和 sub 函数替换了数值但保留了运算符 关于如何克服这个问题有任何提示吗 非常感谢 data lt
  • 是否可以列出已集成到工作区的变更列表?

    实际上 是否可以获得已集成到工作区但未提交的更改列表的列表 关于什么p4 resolved 它不会告诉您确切的更改列表 但它会告诉您哪些文件版本 然后可以很容易地追溯到更改列表
  • Django Reverse 未找到参数“()”和关键字参数“{}”

    嗨 我有一个令人恼火的问题 我有一个像这样的网址模式 mproject myapp urls py url r project P
  • 如何设置visionOS中WindowGroup的大小?

    我想设置 a 的尺寸WindowGroup在visionOS上运行时为特定大小 在 iOS 和 maOS 上我们有 defaultSize对此的修饰符 当为visionOS构建时 Xcode提供了一个稍微不同的修饰符 带有一个称为深度的附加
  • 选择不同的返回重复项

    我有以下查询 SELECT DISTINCT TK TICKETID TK DESCRIPTION TK CREATIONDATE TK REPORTEDBY TK OWNER WF ASSIGNCODE FROM ticket TK IN
  • 如何在c#中创建一个完美的Singleton类?

    我想用 Singleton 类存储一些数据 据我研究 单例类只能实例化一次 但这对我不起作用 有人可以更正我的代码吗 public class MvcApplication System Web HttpApplication Single