C#实用程序功能静态方法/静态类/单例模式

C# Utility functionality Static Method / Static Class / Singleton pattern

我正在一个实用程序类内创建一个实用程序方法GetServiceTicketNumber(),因为该方法将经常使用,所以我不希望每次都实例化,因此我将该方法作为静态的。

UtilityManager也包含其他几种方法。

我的问题是:

1)这是实现功能的正确方法吗?

2)是否使UtilityManager也成为静态类?,有什么区别?

3)下面的代码(用于TicketProvider功能)是否以单例模式编写?(考虑到大多数单例类实例化同一类UtilityManager)。

其他信息:在ASP.NET应用程序中调用的类

1
2
3
4
5
6
7
8
9
public  sealed class UtilityManager
{    
    public static readonly TicketProvider _ticket = new TicketProvider();

    public static int GetServiceTicketNumber()
    {      
        return _ticket.GetTicket();
    }
}


1:听起来可行;通常这是一个主观的调用;例如,如果您的实用程序依赖于静态字段,这将限制您对每个AppDomain进行单个设置。这可能很好,但如果您以后搬到多租户,可能会受到限制。这也可能更难测试。

2:静态类不能有实例(或实例方法);如果这些方法都是静态实现的,那么它可能是静态类。

3:在这里,我看不出单件比静态的有什么好处。如果您需要将IS作为实例来处理,例如实现接口,则单例非常有用。

这里的另一个选择可能是常规实例,但只需确保您的所有代码都与同一个实例对话——可能是通过IOC/DI(也可能不是这样)。这将为您提供类似的便利,但在测试和多租户方面更为灵活。

作为补充说明,您可能还需要考虑线程的含义,特别是在Web应用程序(高度线程化)中。共享数据(包括静态字段和共享实例)应正确同步(或不可变)。


实用程序方法最好是声明为静态的,许多代码检查工具(如StyleCop)实际上会建议实用程序函数是静态的,所以您的做法是正确的。如果要拥有TicketProvider的单例实例,可以使用静态构造函数来确保字段在实际访问和初始化之前得到初始化,并且只初始化一次。此外,还可以使类成为静态的,以指示该类不是为实例化而设计的,而是仅用于实用程序。以下是我的建议:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static class UtilityManager
{  
    static UtilityManager()
    {
        Ticket = new TicketProvider();
    }

    public static TicketProvider Ticket { get; private set; }

    public static int GetServiceTicketNumber()
    {      
        return Ticket.GetTicket();
    }
}