我有一个实现接口的实例类,除了接口方法之外,所有方法都是静态的。所有类变量也是静态的。其中两个静态变量实际上是实例变量,并标记为只读。这些只读实例变量是内联初始化的。
这是一个例子
public class Test : ITestInterface
{
public static readonly DbConnection Connection = new DbConnection();
public void static TestMethod1(){
}
public List<string> static TestMethod2(){
}
}
我的Framework层中有很多使用静态连接变量的方法。
这是一个有效的设计吗?我想对我的所有API调用使用相同的对象。我们的想法是避免创建多个连接对象。在任何给定的一天,从客户端加载调用,有可能创建10,000个连接对象。我试图避免这种情况。
答案 0 :(得分:0)
我们的想法是避免创建多个连接对象
用于处理该案例的模式是Singleton模式。您也不必以这种方式实施。但这是一般指导原则。
在您的具体示例中,您可以做的是,渲染类private
的ctor。
public class Test : ITestInterface
{
...
private Test() {}
..
}
这将使得创建一个类的实例变得不可能,并因此也从中推导出它。因此,Test
类的消费者将无法选择其他static
成员。
但总的来说,我强烈建议您查看上面链接的模式。它可能会对你正在做的事情以及你想要做什么有所启发。
答案 1 :(得分:0)
很少有东西,首先你基本上使用连接作为Singleton。这个可以是一个非常精细的设计模式,但是有许多注意事项让我担心你使用它就像你发布的一样。
你有多个线程访问它吗?连接线程安全吗?所有变量都是安全的吗?如果不是,你正在寻找麻烦。
您真的想在应用程序的整个生命周期中保持一个连接打开吗?如果连接关闭会发生什么?单身人士通常是处理这类问题的经理,而不是单一资源。
您知道多个连接效率低吗?大多数连接层(如SQL)管理一个非常有效地管理连接的连接池,而不必担心它。这通常是一个更好的模式,除非您可以通过性能计数器证明您可以更有效地管理连接
我会谨慎地使用Singletons,并且只有在资源真正全局且不变且线程安全的情况下。如果它是全局的,但需要管理和线程安全(想想连接)那么你最好添加一个自定义管理器类。但同样,只有这样才能证明您可以手动处理更多连接和吞吐量,而不是使用普通连接池。