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

use*_*405 4 c# singleton static-methods

我正在实用GetServiceTicketNumber()程序类中创建一个实用程序方法,因为该方法将经常使用,我不想每次都实例化,所以我将该方法和 _ticket设为静态。

UtilityManager 还包含其他几种方法。

我的问题是:

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

2)是否UtilityManager也创建一个静态类/不?,它有什么区别?

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

其他信息:在 Asp.Net 应用程序中调用的类

public  sealed class UtilityManager
{    
    public static readonly TicketProvider _ticket = new TicketProvider();

    public static int GetServiceTicketNumber()
    {       
        return _ticket.GetTicket();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

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

2:静态类不能有实例(或实例方法);如果方法都实现为静态,那么它可能应该是一个静态类

3:我认为单例比静态没有任何好处。如果您需要将 is 视为一个实例,例如实现一个接口,则单例很有用。

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

作为旁注,您可能还需要考虑线程的影响,尤其是在 Web 应用程序(高度线程化)中。共享数据(包括静态字段和共享实例)应该正确同步(或不可变)。