3

コードの設計に関してジレンマがあります。

まず、VBをJavaシステムに変換しています。VBプログラムには、POJOの組み合わせのようなクラスモジュールがあり、そのロジックのためにデータベースにアクセスします。ゲッターとセッターを使用して、JAVAで同様のクラスを作成しました。私のジレンマは、VBコードの構造をコピーする必要があるため(強制的に)、JAVAクラスにクエリサービスも含める必要があるということです。しかし、私たちのフレームワークでは、サービスクラスのみがクエリサービスにアクセスできます。

JAVAクラスをabstactクラスに変更し、代わりにAnonymousクラスを使用することを考えています。

サンプル:

public abstract class MyClass {
     private int a;
     private int b;

     public String calculate1() {
          // do processing for variables a and b
          String sql = "" // build sql here
          List<Map<String, Object>> result = query(sql);
     }

     public String calculate2() {
          // do processing for variables a and b
          String anotherSql = "" // build anotherSql
          List<Map<String, Object>> result = query(anotherSql);
     }

     protected abstract List<Map<String, Object>> query(String sql);

     // getters and setters for a and b
}

public class MyService {
     @Autowired
     private QueryService myQueryService;

     public void execute() {
          MyClass myClass = new MyClass() {
             @Override
             protected List<Map<String, Object>> query(String sql) {
                 return myQueryService.executeQuery(sql);
             }
          };
     }
}

考慮すべきいくつかの事柄:

  1. 私のサービスはシングルトンスコープのBeanです。
  2. MyClassがセッションベース(ユーザーごとに1インスタンス)であるのも好きです。
  3. SpringコンテキストでMyClassを宣言しないため、依存性注入を使用したり、他のサービスを使用したりすることはできません。インスタンスをセッションに保存し、MyClassのインスタンスを取得するだけです。

また、このジレンマのために、文字列クエリとJDBCテンプレートを使用せざるを得ません。元々、私たちのフレームワークはDAOオブジェクトとHibernateを使用しています。誰かがDAOを使用してコードを解決できるのであれば、それはより良いでしょう。DAOオブジェクトを使用する場合は、DAOサービスクラスで異なるDAOオブジェクトを使用する必要があります。

これが良いデザインかどうかは完全にはわかりません。これがうまくいくかどうかもわかりません。私の環境ではこれを実行できませんでした。

誰かが私を教えてくれたら本当にありがたいです。

ありがとう!

4

1 に答える 1

1

のインスタンスは のMyClassインスタンスなしでは機能しないQueryServiceため、クエリ サービスへの参照を のコンストラクタに渡すだけではどうですかMyClass

public abstract class MyClass {
    private final QueryService queryService;

    public MyClass (QueryService queryService) {
        this.queryService = queryService;
    }

    protected List<Map<String, Object>> query(String sql) {
        return queryService.executeQuery(sql);
    }
}

public class MyService {
     @Autowired
     private QueryService myQueryService;

     public void execute() {
          MyClass myClass = new MyClass(myQueryService);
     }
}

queryServiceインスタンスフィールドを作成し、finalそのようなコンストラクターを持つことで、この依存関係をコードで明確に表現できます。

于 2012-10-27T18:13:14.990 に答える