1

DataSourceクラスに操作を委任するGenericDAOがあります

public class BaseDAOImpl<T> implements BaseDAO<T> {     
    DataSource ds;      

    public T update(T entity) {
    ds.update(entity);
    }

私が今抱えている問題は、複数のデータソースで機能させたいということです。これは私に2つの選択肢を残します

1)データソース用にDAOでセッターを作成し、すべての操作の前に使用します

2)BaseDAOの各子をデータソースの数ごとにn回作成します

DataSourceにDAOから抜け出させたいのですが、アクションをDAOに委任するにはどうすればよいですか?

4

4 に答える 4

1

ファクトリを使用してデータソースを作成できるため、要件に応じてデータソースを作成し、依存性注入を使用してデータソースをDAOに注入できるかどうかを確認します。

DAOでデータソースを取り除くには、デリゲートパターンを使用し、DAOにデリゲーターを挿入すると、デリゲートはDataSourceの参照を持ちます。

また、ジェネリックDAOを1つだけ使用し続けると、DAOは最終的にジェネリックではないが、アプリケーションの特定の機能に固有のメソッドでブロットされる可能性があることに注意してください。 DAOは実際に一般的な作業を行います。

于 2012-05-22T06:37:19.783 に答える
1

マルチテナンシーのようなものを実装したいと思います。要求がユーザーAから来る場合、その要求の処理に関与するすべてのDAOはユーザーAと通信する必要がDataSourceあります。

もしそうなら、それDataSourceはあなたのリクエストのコンテキストの一部であり、この種のコンテキストデータを保存するための1つの可能なオプションは以下を使用することThreadLocalです:

  • リクエストが来たら、適切なものを入れDataSourceますThreadLocal
  • DataSourceすべてのDAOは、そこからを取得しThreadLocalます。
    明らかに、単一責任の原則のために、このロジックをファクトリの背後に隠し、そのファクトリをDAOに注入して、DAOがfactory.getCurrentDataSource()各操作を呼び出すようにすることをお勧めします。
  • ThreadLocalリクエストの処理が終了したらクリアします。

各リクエストが単一のスレッドによって処理される場合にのみ機能することに注意してください。

于 2012-05-22T08:48:35.457 に答える
0

データソースにはセッターを使用せず、DAOのコンストラクターに渡します。DAOオブジェクトの存続期間中にデータソースを変更できるとは思えません。

于 2012-05-22T07:00:54.000 に答える
0

この場合、依存性注入を試して使用する必要があると思います。基本クラスは、データソースのタイプから抽象化されます。したがって、新しいタイプのデータソースを追加する場合でも、最終的に行う変更は、現在のリクエストに基づいてあるタイプのDataSourceオブジェクトを生成するファクトリメソッドのみであり、アプリケーションの緩い結合が増加します。

interface IDataSource<T>
{
    T update<T>(T entity);
}

public ConcereteDataSource<T> : IDataSource<T>
{
    public T update<T>(T entity)
    {
        //Concerete implementation
    }
}


public class BaseDAOImpl<T> implements BaseDAO<T> 
{     

    public IDataSource ds {get;set;}
    public T update(T entity) {
    ds.update(entity);
}

//where you try to instansiate a new instance of Base DAO

//Factory to create a new instance of datasource for this context
IDataSource contextualDs = GetDataSourceForThisUser();

BaseDAOImpl<SomeType> dao = new BaseDAOImpl<SomeType>();
//inject the dependency
dao.ds = contextualDs;
于 2012-05-22T11:55:04.720 に答える