当数据消费者激增时,我怎样才能保持干爽和凝聚力?

时间:2012-06-15 00:02:43

标签: c# winforms oracle static dry

我有一个静态类,我用作项目的“Data Utils”。

该项目有多个表单和类,其中多个表单和类调用此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;
    }

2 个答案:

答案 0 :(得分:1)

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

class SimpleClass
{
    // Static constructor
    static SimpleClass()
    {
        //...
    }
}

答案 1 :(得分: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

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