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

静的コンストラクターを定義し、接続を初期化できるのは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

もちろん、これがすべての状況で誰にとっても最善であるとは限りませんが、1 つの可能性についてアイデアを提供したかっただけです。あなたに合った良い方法が見つかりますように!

于 2012-06-15T00:15:30.987 に答える