1

我有一个静态类,用作我的项目的“数据实用程序”。

这个项目有几个表单和类,其中多个调用这个 Data Utils 类/数据库。

我不想违反 DRY 原则,所以我不想有多个 OracleConnection 组件,一个扑通一声放到每个表单上。

我也不想通过让我的 Data Utils 类获得我的主要表单的“肉体”知识并为 OracleConnection 访问它来破坏凝聚力。

可以在每个 Data Utils 方法中创建一个动态 OracleConnection,但这也会违反 DRY。

将我的静态类转换为非静态类,给它一个 OracleConnection 成员,并在构造函数中实例化它是我最好的解决方案吗?

更新

对于后代,这就是我所做的,基于 LukLed 的建议:

internal class GreatAmericanNovelistsData
{
    private static OracleConnection oc;
    static GreatAmericanNovelistsData()
    {
        oc = new OracleConnection();
        oc.ConnectionString = "User Id=SCLEMENS;Password=HucKfiNn;Server=HANNIBAL;Pooling=True;Min Pool Size=0;Max Pool Size=10;Connection Lifetime=0;Direct=True;Sid=HANNIBAL;Service Name=HANNIBAL;";
        oc.Direct = true;
    }
4

2 回答 2

1

您只能定义一次静态构造函数并初始化连接。OracleConnection对象也可以是静态的。详情在这里

class SimpleClass
{
    // Static constructor
    static SimpleClass()
    {
        //...
    }
}
于 2012-06-15T00:07:26.540 回答
1

将我的静态类转换为非静态类,给它一个 OracleConnection 成员,并在构造函数中实例化它是我最好的解决方案吗?

但这会违反依赖倒置原则;)

这听起来有点类似于我在最近的一个应用程序中所做的,我最终做的是有一个返回我的 OracleConnection 实例的工厂(我有一个工厂,因为我需要确保每个线程有 1 个实例,所以我在一个工厂)。工厂实现了一个接口,并且各种构造函数接受了一个作为该接口的参数。依赖注入框架(如 Unity 或 Ninject)用于注入适当的工厂。这也使它更易于测试,因为我可以模拟工厂。

所以在代码中,我最终做了类似的事情(如果语法有点不对,这让我很抱歉):

public interface IDbConnectionFactory
{
  public IDbConnection GetConnection();
}

public class OracleConnectionFactory : IDbConnectionFactory
{
  public IDbConnection GetConnection()
  {
    return new OracleConnection();
  }
}

public class MyAwesomeDataAccess
{
  private IDbConnectionFactory dbConnectionFactory;

  public void MyAwesomeDataAccess(IDbConnectionFactory() dbConnectionFactory)
  {
    this.dbConnectionFactory = dbConnectionFactory;
  }

  public SomeData SomeMethod()
  {
    var connection = dbConnectionFactory.GetConnection();
    // do stuff with connection...
  }
}

然后在我的 Unity 配置中我映射了IDbConnectionFactory -> OracleConnectionFactory

当然,这可能不是在所有情况下对每个人都是最好的,但我只是想就一种可能性给出一个想法。希望你能找到适合你的好方法!

于 2012-06-15T00:15:30.987 回答