0

依存性注入を使用して Objectify DAO を実装することを考えています。これにより、同じ "Dao" にアクセスするコードを維持できるようになりますが、実装は Objectify から Hibernate-MySQL または MongoDb に変更される可能性がありますが、コードの変更を心配する必要はありません。 UI またはクライアント側。

UserDao は、次の例に基づいています: http://turbomanage.wordpress.com/2010/01/28/simplify-with-objectify/

UserObjectifyDaoImpl implements Dao<User> {

 private UserDao dao = null; 

 public void put(User entity) {
    if (dao == null) {
       dao = new UserDao(); 
    }
    dao.put(entity);
 }
 // other put and set methods
}

そのように、私は持っていcontext.xmlます:

<bean id="userDao" class="com.example.server.daoimpl.UserObjectifyDaoImpl">
    <property name="dataSource" ref="dataSource"/>
</bean>

実装を変更する必要がある場合は、この BeanUserObjectifyDaoImplを次のように変更するだけです。

UserHibernateDaoImplまたはUserMongoDBDaoImpl、任意の実装を任意のデータベースに保存します。

そして、次のように、UI / クライアントにコードをそのまま残します。

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());

Dao dao = (Dao) ctx.getBean("userDao");
dao.put(something);

今すぐこれを行う必要がある理由の 1 つは、(objectify を介して) アプリ エンジンを使用して開発する必要があることですが、将来的には、一部のデータ アクセス オブジェクトを休止状態に変更し、一部を mongodb に変更する必要があるかもしれません (そのため、混在しています)。

このコードをテストしていませんが、この戦略は機能しますか?

4

2 に答える 2

1

はい、これでうまくいきます。実際、これがインターフェイスへの DI とコーディングが発明された主な理由の 1 つです。すべての DAO 実装が同じ契約に従っていることを確認してください (DAO は非常に頻繁に漏れのある抽象化を導入します)。

また、同じ目標を達成するためのオプションが他にもいくつかあります。

  • としてマークされたいくつかの@Service注釈付きクラス@Primary(自動配線を使用している場合)

  • Spring プロファイルと Bean の選択的活性化

ところで、別の DAO 実装への切り替えを検討している場合は、CrudRepositorySpring Dataをご覧ください。Spring Data プロジェクトは、MongoDB、Neo4J、JPA などにこのインターフェースを実装するいくつかのモジュールを提供します。

当分の間、いくつかの Spring Data モジュールはうまく連携しないようです (参照: DATAJPA-146 )。そのため、実装することを選択した場合は、CrudRepositoryこの問題が修正されているか、回避できるかを確認してください。それを指摘してくれた@iddqdに感謝します。

于 2012-02-09T12:09:54.453 に答える
0

アプリケーションで実装が 1 つだけ必要な場合は、コンテキスト構成を選択した Dao 実装に変更できますが、アプリケーションで複数の実装が必要な場合 (混合モード) は、Factory Layerを設計する必要があります。Factory という名前のレイヤーとその API および実装を設計しようとすると、Dao (Hibernate、MongoDB、JP など) をいつでも選択する必要があることがわかります。

于 2012-02-09T12:21:09.167 に答える