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



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

UtilityManager还包含其他几种方法。

我的问题是:

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

2)是否UtilityManager也做一个静态类?,它有什么区别?

3) 下面的代码(用于票务提供程序功能)是否以单例模式编写?(考虑到大多数单例类UtilityManager实例化相同的类。

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

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 的单一实例,可以使用静态构造函数来确保字段在实际访问和初始化之前仅初始化一次。还可以使类成为静态,以指示此类不是为实例化而设计的,而是仅用于实用程序。以下是我的建议:

public static class UtilityManager
{  
    static UtilityManager()
    {
        Ticket = new TicketProvider();
    }
    public static TicketProvider Ticket { get; private set; }
    public static int GetServiceTicketNumber()
    {       
        return Ticket.GetTicket();
    }
}

最新更新