使用方法改进连接类:打开和关闭

时间:2010-11-01 07:08:52

标签: c# .net-3.5

我正在使用.NET 3.5 C#。我有一个简单的连接类,只有两个方法:OpenConnection()和CloseConnection()。我将此类定义为Static,以便在调用方法时不必创建实例。我想知道是否:

(1)我应该创建一个包含OpenConnection和CloseConnection方法定义的接口,从而将此接口与Connection类一起使用。没有理由使用界面,但我在想是否可以使Connection更专业。

(2)将此类声明为静态可以吗?

7 个答案:

答案 0 :(得分:2)

有两种完全不同的方法

  • Singleton:整个应用程序中的单个对象。

在这种情况下,您还必须处理lock机制。

class Connection
{
    public static Connection Instance() {
        if (_instance == null) {
            lock (typeof(Connection)) {
                if (_instance == null) {
                    _instance = new Connection();
                }
            }
        }
        return _instance;      
    }
    protected Connection() {}
    private static volatile Connection _instance = null;
}
  • 实施IDisposable

或者,您可以在Connection课程中implement IDisposable,并使用using关键字自动处理。例如:

using(Connection c = new Connection(SomeConfiguration)) //Opens the connection.
{
    Something(c);
}// Closes the connection. Dispose is implicitly called in the scope of the using statement.

或者如果您想要Generic Connection类,那么Marc已经回复了一个优秀的database connection class example here

关于第1点;你可以使用界面;当且仅当:

  • 您希望代码中的松散耦合,组件化和可维护性。

  • 您希望保证类的行为与接口中定义的方法/契约完全相同。例如,在这种情况下,如果从IDisposable扩展类,接口强制不仅可以处理对象而不会出现编译器错误,而且应该处理它们。因此,只需遵守一个接口,就可以在代码中提供类似的保证

  • 你有一个团队正在开发一个大模块;并且你想保持代码一致;所以你可以定义一个界面并添加一些限制,这将有助于轻松集成它。例如:

你知道你有一个模块可以处理很多连接,不同类型的连接 - 其中一些可能在以后的开发过程中被识别出来。但你肯定知道的是,所有类型的连接都应该能够打开和关闭;并且您还希望所有开发人员都遵守此规则。所以你可以想出一个像:

这样的界面
interface IMyConnection
{
    Open();//Opens the connection
    Close();//Closes the connection
}
  • 您希望某些课程能够执行大量复杂的工作,并且在项目的其余部分之前不会完成;然后项目的其余部分可以使用界面,避免依赖于该类。

  • 您计划在商业上部署您的产品;并希望它可以由第三方开发人员扩展。

答案 1 :(得分:1)

如果使用界面,则无法定义静态方法。 (或者换句话说,静态方法总是指向定义的类,因此接口在此时不能提供抽象)。

一个类可以是静态的,只要你想要共享所有东西,并且不需要对它进行扩展。但我强烈建议您查看Singleton PatternAbstract Factory作为设计问题的替代方案。

interface IConnection {
    void Connect();
    void DisConnect();
}

class TCPCustomConnection : IConnection{
    // implement other stuff

    // Singleton Pattern
    static IConnection Instance {
        privateInstance = privateInstance ?? new TCPCustomConnection();
        return privateInstance;
    }
}

答案 2 :(得分:1)

从你到目前为止所说的,我看不到界面如何增加价值。如果它没有增加价值,它应该从设计中消除。该接口引入了两个新问题:您需要获取指向接口实现的指针,并且通常您希望避免重复请求它。所以除非为你的设计增加价值(以有形的,而不是形而上的方式),否则不要这样做。

如果接口简化了代码的单元测试,或者删除对实现连接的程序集的运行时依赖性很重要,那么接口可能会增加值。这些日子非常流行。

答案 3 :(得分:1)

简单的静态类是必须的,如果它只是用于划分开放和关闭连接等操作,更喜欢简单,不要为未来的场景编码,直到它是绝对必要的并且不会改变现有的工作代码直到达到一个点绝对需要的地方

答案 4 :(得分:1)

我的建议:

(1)为什么你需要编写自己的Connection类,因为它是“一个简单的连接”?没有内置类符合您的要求吗?

(2)根据MS示例,将OpenClose方法设为静态非常奇怪。我们习惯了这个:

conn.Open();
conn.Close();

而不是:

MyConnection.Open(conn);
MyConnection.Close(conn);

(3)使用接口是一个好主意,尤其是IDisposable

class MyConnection : IDisposable
{
   public void Dispose()
   {
      //close the connection and release resources
   }
}
using (MyConnection conn = new MyConnection(connStr))
{

} //automatically Dispose()

答案 5 :(得分:1)

如果您使用不同的连接类型,例如UDP, TCP, COM Port, ...使用interface有利于可管理性,但在您只有一个连接的情况下则无需使用接口,我认为使用static和单例在这里没用,你应该为你的tcp连接提供一个服务,以便始终保持它,当你断开连接时,你应该能够修复连接。有关良好的tcp服务器示例,请参阅http://fadd.codeplex.com/SourceControl/changeset/view/58859#1054893

答案 6 :(得分:1)

即使你认为你只需要一个连接,我仍然会使用一个实现接口来处理它的实例类。

为什么?

  • 如果需要(或重构现有的),我可以轻松交换实现。
  • 我可以通过模拟连接来单独测试依赖于类的东西。
  • 我可以更轻松地控制连接的生命周期(例如,使用IDisposable)。
  • 我编写的任何API的消费者都可以看到我的依赖项。
  • 如果单实例要求确实发生了变化,我不必取消对static / singleton方法的所有引用。

此处的测试点很重要:如果您使用对固定外部资源的静态引用,则您的代码几乎不可能独立于该资源进行单元测试。

有关静态与实例类和方法的类似讨论,请参阅this answer