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

时间:2011-05-21 22:34:05

标签: 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();
    }
}

2 个答案:

答案 0 :(得分:4)

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

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

3:我认为单身人士在静态方面没有任何好处。如果您需要将待处理作为实例,例如实现接口,则单例非常有用。

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

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

答案 1 :(得分:3)

实用程序方法最好声明为静态,许多代码检查工具(如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();
    }
}