【问题标题】:How to initialize and make use of a static class?如何初始化和使用静态类?
【发布时间】:2014-04-15 01:04:36
【问题描述】:

我有一个静态类,用于访问静态并发字典:

public static class LinkProvider
{
    private static ConcurrentDictionary<String, APNLink.Link> deviceLinks;
    static LinkProvider()
    {
        int numProcs = Environment.ProcessorCount;
        int concurrencyLevel = numProcs * 2;
        deviceLinks = new ConcurrentDictionary<string, APNLink.Link>(concurrencyLevel, 64);
    }


    public APNLink.Link getDeviceLink(string deviceId, string userId)
    {
        var result = deviceLinks.First(x => x.Key == deviceId).Value;
        if (result == null)
        {      
           var link = new APNLink.Link(username, accountCode, new APNLink.DeviceType());
           deviceLinks.TryAdd(deviceId, link);
           return link;

        }
        else
        {
            return result;
        }
    }


    public bool RemoveLink(string deviceId)
    {
        //not implmented
        return false;
    }
}

如何在asp.net的控制器中使用这个类

即我想去:

LinkProvider provider;
APNLink.Link tmpLink = provider.getDeviceLink(id, User.Identity.Name);
//use my link

背景。该字典用于保存asp.net web api程序中状态/请求之间的链接对象。因此,当服务需要使用链接时,它会要求链接提供者为它找到一个链接,如果没有,它必须创建一个。所以我需要字典对象到我所有的 http 请求中的同一个实例。

【问题讨论】:

  • 如果你在做一个静态类,一切都应该是静态的。如果初始化,有一个私有的bool 来标记,并在getDeviceLink 的开头处理它。
  • 那么在我的场景中我真的需要一个静态类吗?我可以不只是让字典静态吗?
  • 如果字典是静态的,您是否需要LinkProvider 的实例来处理字典?可能是。取决于它对 非静态 数据所做的其他事情。但如果不是,静态类可能是完全合适的。
  • 换句话说,如果字典是静态的,并且所有方法都只适用于该字典并且不需要需要任何其他数据,那么静态类可能是最合适。

标签: c# static initialization static-class


【解决方案1】:

所以我需要字典对象指向我所有 http 中的同一个实例 请求

然后使用static 类,并将每个方法都设为static,因此您可以使用以下语法调用它:

APNLink.Link tmpLink = LinkProvider.getDeviceLink(id, User.Identity.Name);

话虽如此,您应该知道 ASP.Net 应用程序中的内存中静态变量并不总是可以安全使用,因为您的应用程序不是无状态的,并且在应用程序池的情况下被回收,您的字典将被重新实例化。

【讨论】:

  • 我可以不初始化 asp.net 提供的 Startup 类中的类,您通常会在其中添加自定义过滤器和路由吗?那么静态类的初始化是如何工作的呢?
  • @Zapnologica 好吧,很难说究竟什么时候会调用静态构造函数,但无论如何,它将在类的任何静态方法/成员之前调用在您的代码中使用(对于静态类,在非静态类的任何实例方法/成员之前)。
  • 那么我的构造函数在示例应用程序中是否正常?但是每次使用链接提供程序时都不会调用我的构造函数
  • @Zapnologica 是的,你的构造函数很好,它只会被调用一次。但 getDeviceLink 应该是静态的。
猜你喜欢
  • 2020-04-14
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多