2016-09-22 57 views
-1

我有一个实例类,它实现了一个接口,并且除接口方法以外的所有方法都是静态的。所有的类变量也是静态的。其中两个静态变量实际上是实例变量,并标记为只读。这些只读实例变量是内联初始化的。ReadOnly C#类中的引用变量

下面是一个例子

public class Test : ITestInterface 
{ 

    public static readonly DbConnection Connection = new DbConnection(); 

    public void static TestMethod1(){ 
    } 

    public List<string> static TestMethod2(){ 
    } 

} 

我有很多的方法,在使用静态连接可变我的框架层。

这是一个有效的设计?我想为我所有的API调用使用相同的对象。这个想法是为了避免创建多个连接对象。在客户端调用负载的任何一天,都有可能创建10,000个连接对象。我试图避免这种情况。

+0

这就是连接池的用途。连接对象应该是短暂的。尽可能在最后时刻创建并尽快销毁它。让连接池负责创建/汇集连接以供重用。 – Kevin

+0

这不是Sqlconnection,它是第三方消息系统连接类。 – Chiran

+0

我严重怀疑这个第三方连接是线程安全的,这将使它很难正确使用。除非你真的只从一个线程中调用它。您遇到的另一个主要问题是,如果连接中断并变得不可用,会发生什么情况。你将如何安全地重新初始化它? –

回答

0

这样做是为了避免造成多发性连接对象

,是为了处理这种情况的图案是Singleton模式。也不是你需要必须以这种方式实现。但这是一个普遍的指导原则。

在你的具体例子中,你可以做的是渲染类private的类。

public class Test : ITestInterface 
{ 
    ... 
    private Test() {} 
    .. 
} 

这将使创建一个类的实例变得不可能,并且从中推导出来。所以你的Test类的消费者将没有其他选择,那么只能访问static成员。

但是总的来说,我强烈建议你看看上面链接的模式。它可能会对你在做什么以及如何闪耀你想要做的。

+0

非常感谢。我会研究一下 – Chiran

0

几件事情,首先你基本上使用连接作为单身。这可以是一个完美的设计模式,但有一些考虑,让我担心你使用它像你发布。

  1. 你有多个线程访问它吗?连接线程安全吗?所有的变量都是线程安全的吗?如果不是,你正在寻找麻烦。

  2. 您是否确实希望在应用程序的整个生命周期内保持一个连接打开?如果连接关闭会发生什么?单身人士通常是处理这类问题的经理,而不是单一资源。

  3. 您是否知道多连接效率低下?大多数连接层(如SQL)管理连接池,可非常有效地管理连接,而无需担心连接。这通常是一个更好的模式,除非你能与您可以管理在资源是真正的全球性的和不变的只有在情况下,连接自己更有效地

我会用单身谨慎和性能计数器证明,以及作为线程安全。如果它是全球性的,但需要管理和线程安全(认为连接),那么你最好添加一个自定义管理器类。但是,只有在可以证明您可以手动处理更多连接和吞吐量的情况下,才能使用正常连接池来执行此操作。

+0

我的测试类是通过IIS的应用程序初始化特性运行的,并且只在一个线程中运行。 – Chiran