2012-02-09 18 views
0

私はObjective DAOを依存性インジェクションで実装することを考えていますが、実装はObjectifyからHibernate-MySQLまたはMongoDbに将来変更されるのに対し、同じ "Dao"私はUIやクライアント側のコードを変更することを心配しています。SpringでDAOを実装する

UserDaoは、ここでの例に基づいています。 、私はcontext.xmlを持っていることを、このような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 
} 

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

そして、私は実装を変更する必要がある場合、私はちょうど変更する必要がありますこの豆はUserObjectifyDaoImplから次のようなものになります。

UserHibernateDaoImplまたはUserMongoDBDaoImpl、またはどのような実装であれ、どのデータベースに保存してもかまいません。

そして、まだ無傷でUI /クライアントに私のコードを持っている、のような:私は今、この権利を行う必要があり

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

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

一つの理由は、私は(客観経由)アプリのエンジンを使用して開発する必要がある、しかし、中将来私は一部のデータアクセスオブジェクトを休止状態に変更し、一部をmongodbに変更する必要があるかもしれません。

このコードはテストしていませんが、この戦略は有効ですか?

答えて

1

はい、これは動作します。実際、これはDIとインタフェースへのコーディングが発明された主な理由の1つです。すべてのDAO実装が同じ契約に従っていることを確認してください(DAOはたいていleaky abstractionsを導入します)。 (あなたはオートワイヤリングを使用している場合)@Primaryとしてマークされた1

  • Spring profilesと豆の選択的活性化と

    • いくつか@Service注釈付きクラス:

      はまた、あなたは同じ目標を達成するには、いくつかの他のオプションを持っています

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

    当面、いくつかのSpring Dataモジュールがよく一緒に再生されないようです(DATAJPA-146参照)。 CrudRepositoryを実装してください。この問題は修正されているか、回避してください。それを指摘してくれた@iddqdに感謝します。

  • +1

    これは動作します。あなたは大統領ですが、春のデータは良い方法ですが、SQLのみです。spring-data-mongodbは現在他のデータソースでは使用できませんhttps://jira.springsource.org/browse/DATAMONGO-389、https://jira.springsource.org/browse/DATAJPA-146 – iddqd

    +0

    @iddqd:Nice ..しかし、私はOPが1つの実装から別の実装に完全に切り替えると同時に、それらを使用しないと考えています。 –

    +1

    "私は今これを行う必要がある理由の1つとして、オブジェクトエンジンを使用してアプリケーションエンジンを使用して開発する必要がありますが、将来は一部のデータアクセスオブジェクトを休止状態に変更し、一部をmongodbに変更する必要があります。 " – iddqd

    0

    アプリケーションで実装が1つだけ必要な場合は、選択されたDao実装に変更できますが、アプリケーションで複数の実装が必要な場合は、デザインファクトリレイヤが必要です。あなたはFactoryとそのAPIと実装を持つレイヤーを設計しようとしており、いつでもDao(Hibernate、MongoDB、JPなど)を選択する必要があります。

    関連する問題