【问题标题】:Making all DAL methods static将所有 DAL 方法设为静态
【发布时间】:2014-07-20 22:04:39
【问题描述】:

在我的 win 表单应用程序中,我有一个名为 DataServices 的服务类,当涉及到 CRUD 操作时,它为所有其他客户端类(大约 12 个类)提供数据库访问服务。 (我正在使用 ADO.net)。这个类有很多公共方法。以下是该类实现的部分接口。

interface IDataService
    {
        BankAccount GetByACNo(string acNo);
        bool InsertAccount(IBankAccount ba);
        bool UpdateAccount(IBankAccount ba);

        bool InsertClient(IClient newClient);
        Client GetClientByCID(int CID);
        Client GetClientByName(string clientName);
        void UpdateClient(IClient changedClient);
        DataTable LoadClientNamesAndCID();

        DataTable LoadPointNamesAndPID();
        bool InsertPoint(IPoint newPoint);
        Point GetPointByPID(string id);
        bool UpdatePoint(IPoint point);
        Point GetPointByName(string id);
        List<string> GetPIDs(string firstLetterOfPointName);

        // other methods...
    }

由于这些方法没有使用任何实例变量,是否将所有方法都设为static

【问题讨论】:

  • 你不能在接口中声明静态方法。
  • 现在这些方法不是静态的。这就是为什么我要问它们是否应该是静态的?
  • 您打算如何将它们设为静态?从实现它们的类中删除接口?我想说的是(这可能不是您要问的)是您不能在接口中将方法标记为静态,也不能在实现接口的类中将它们实现为静态.
  • 实际上我想知道的是保持它们原样(如上)或使它们静态(如你所说的删除接口......)更好的做法是什么?
  • 使用接口的要点是您可以替换 DAL 的另一个实现。例如对测试很有用。使用静态方法完全违背了这一点,它们只能有一个实现。要么不使用接口,要么正确使用实例方法。

标签: c# .net static ado.net data-access-layer


【解决方案1】:

来自 MSDN http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

"静态类和类成员用于创建数据和 无需创建类实例即可访问的函数。 静态类成员可用于分隔独立于任何对象标识的数据和行为: 无论对象发生什么,数据和函数都不会改变。 当类中没有依赖于对象标识的数据或行为时,可以使用静态类。”

问题

1) 这取决于你如何真正调用你的方法, 如果您没有任何理由创建类的实例,则可以使用静态方法。 这种方法没有任何问题。

2) 如果静态方法设置正确,则不是问题。 每个用户无论该方法是否是静态的,都会对底层数据源(XML、DB 等)产生相同的影响

但总体设计有所不同 - 静态方法几乎应该始终是线程安全的(即您应该使它们成为线程安全的),而 实例方法通常不必是(尽管你应该记录你的类的线程安全)。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2011-08-16
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多