C# 身份验证中使用的单例

C# 身份验证中使用的单例,c#,singleton,C#,Singleton,我在一个我负责修改的站点上遇到了一个单例实现。关于Singleton,我只知道它的定义,因此从来没有机会“使用”它。所以我开始阅读文章,这篇文章很好地解释了这一点。除了我的代码看起来不太一样。一些人可以看看这一点,并指出这段代码是做什么的,或者它有什么不同吗 public class Singleton<TSingleton> where TSingleton : class, new() { private static readonly Lazy<TSingleto

我在一个我负责修改的站点上遇到了一个单例实现。关于Singleton,我只知道它的定义,因此从来没有机会“使用”它。所以我开始阅读文章,这篇文章很好地解释了这一点。除了我的代码看起来不太一样。一些人可以看看这一点,并指出这段代码是做什么的,或者它有什么不同吗

public class Singleton<TSingleton> where TSingleton : class, new()
{
    private static readonly Lazy<TSingleton> instance = new Lazy<TSingleton>(() => new TSingleton());

    public static TSingleton Instance { get { return instance.Value; } }
}
奇怪的是,在我写这篇文章的时候,这些部分是如何组合在一起的,但有一件事还不清楚,为什么只允许这个accessData对象的一个实例?

“为什么只允许这个accessData对象的一个实例?”

仅仅根据提供的代码就很难说清楚。可能多个用户同时在系统上处于活动状态。类名
AccessLoggerData
表明正在记录信息


如果涉及文件访问,则只需要一个实例记录该数据。您不希望多个实例竞争文件写入锁。问题是在实际的代码中没有这样的建议。也许这意味着一次只允许一个用户,他们的状态由这个单例控制。那样的话,这是个糟糕的设计。考虑到
AccessLoggerData
中有另一个用于应用程序设置的单例,您有一个全局单例:不好。它可能是前开发人员的Singletonitis。

这看起来像是使用(newish)Lazy关键字的singleton模式的通用实现。在默认形式下,它确保只访问所创建对象的单个实例(LazyThreadSafetyMode.ExecutionAndPublication)。这一点很重要,因为所创建对象的初始化代码可能会产生一些副作用,如果执行两次,这些副作用将是不可取的。有关此的更多信息,请签出

public class AccessLoggerData
{
    public string Environment = Singleton<ApplicationSettings>.Instance.Environment;
    public string Page, UserId;

    public AccessLoggerData(string page, string user)
    {
        this.Page = page;
        this.UserId = user;
    }
}