可以接受使用静态类?

时间:2010-12-09 19:41:46

标签: c# static static-classes

有一个本来不是静态的课程......

public class SapApprovalHandler {

    private static SapGs3DataSet sapGs3DataSet;

    static SapApprovalHandler() {
        try {
            // Actually fills the dataset
            sapGs3DataSet = new SapGs3DataSet("SAP");
        }
        catch {
            throw new ApplicationException("Unable to create the SAP-GS3 DataSet");
        }
    }

    public static XElement ProcessApprovals(XElement SapData) {
        // Basically updates the dataset
    }

}

在我构建课程时,我决定(1)除非我明确刷新数据集,否则我宁愿不重新填充数据集,以及(2)我是这些数据的守门人;没有其他人应该更新它们。从WCF服务中调用此类。

除了我想要重用的数据集之外,没有状态;这个类的每个函数都可以是静态的。但是让这个类静态可以接受吗?而不是实例化它并在WCF上有一个成员级变量来保存它。我不确定我能看出两种方法之间的区别。

为了减少争论,让我问一下:使类静态有什么缺点?我可能不想这样做的原因。

随意批评这种方法;通常我会在ProcessApprovals中创建数据集并在调用结束时处理它,但我真的不需要经常刷新数据,如果有的话(我有一个单独的数据集,其中包含更多的瞬态数据)我更新它的时间; SapGs3DataSet数据确实不会改变。)

另一种方法是使用企业库来缓存数据集,这样我就可以设置过期和方法来刷新数据。

我会根据最强烈的争论选择答案,为什么我不应该这样做。如果没有任何强有力的论据可以不做,我会用最好的理由选择答案,为什么它没问题。

TIA!
詹姆斯

2 个答案:

答案 0 :(得分:2)

我会考虑在对象上使用缓存而不是将其设置为静态。静态类通常难以在测试中测试和使用。即使使数据静态也会增加运行自动化测试的难度,因为您需要采取额外步骤来设置测试数据,添加代码以满足测试需求。使用缓存可以实现相同的效果,并且如果需要空间用于其他目的,还允许刷新数据。如果需要,您可以在从缓存刷新时自动重新填充对象,以便您的请求通常不会出现任何性能下降。

答案 1 :(得分:0)

如果你让它变得静止,然后改变主意并希望保持某种状态,那么你就不能。