2009-07-05 15 views
6

申し訳ありませんが、これは本当に基本的な質問ですが、それは本当に私に得ています。私はDIのアイデアが本当に好きです。私のテストでは本当に助けになりますが、私は考えているレンガの壁にちょっと打ちました。だから私は、2つのタイプがあります。DIオブジェクトのグラフ構築 - ロジックと構築グラフの分離

Table 
TableManager 

は今、テーブルのオブジェクトは、このようなことにコンストラクタを持っています

Table(ITableCommandRunner tableRunner, 
     IQueryProvider queryProvider, 
     IDataReader reader, 
     string Name) 

今テーブルオブジェクトはかなりだけなので、あなたが求めるルールを以下のこれらのオブジェクトを使用しています必要なものを渡します。今は、TableManagerオブジェクトを使用して、etcテーブルを開いたり閉じたりします。必要なのはITableCommandRunnerだけなので、コンストラクタで渡します。

TableManager(ITableCommandRunner tablrunner) 

[OK]を、それは大丈夫ですが、TableManager.OpenTableコマンドで私がITableCommandRunner上で開いているテーブルのcommmandを呼び出した後、戻って渡すために新しいテーブルオブジェクトを作成する必要があります。

public ITable OpenTable(string tableName) 
    { 
     // Call open table command on tablerunner. 
     // I need a IQueryProvider and IDataReader to pass to the table. 
     return new Table<TEntity>(this.tablerunner, provider,reader, tableName); 
    } 

しかし、私は今開いているテーブルコマンドでIDataReaderとIQueryProviderを作成する必要があります。私がそれらをTableManagerのコンストラクタに渡すと、「オブジェクトを内部の型に渡し、実際には使用しない」というオブジェクトに違反しません。

私はこれをどうやって行うのか分かりません。誰も私にこれを手伝ってもらえますか?

私はオブジェクトの構成とロジックをどのように分離するのか分かりません。

答えて

2

TableFactoryは、クエリプロバイダーとリーダーを認識し、テーブル名のみを知る必要があります。工場をTableManagerに渡すことができます。一方、TableManagerはおそらく工場自体である必要があるように聞こえますが、その場合は簡単ですはプロバイダとリーダーを必要とします。 。

基本的に何か「深みのあるツリー」(そして動的に作成されたもの)に情報が必要な場合、それを作成するものはその情報を必要とし、作成者はその情報を必要とします。あなたが慎重でないならば、それは確かに混乱になることがあります。

DIフレームワークによっては、コンテナ内にファクトリのようなオブジェクトを設定し、実行時に新しいインスタンスを作成するように要求することができます。つまり、あなたのコードはDIフレームワークと結びつくことになります。スイングやロータリーの場合です。基本的には、情報はどこかでなければならず、必要なときにいつでも参照チェーンを用意する必要があります。

は申し訳ありませんが、それにcheerier見通しを持っているではないが、これらのアイデアは非常にあなたを助けていない場合でも、少なくとも、あなたが

+0

私はちょうどマネージャーでIQueryProviderとIDataReaderを取らなければならないかもしれないと思う。テーブルマネージャは、ちょうど異なる名前のファクトリです。私はMiškoHeveryとDIに関するgoogleの技術話を見て、彼の言うことに同意しますが、私がいる状況の実例を見つけることはできません。それらを下にして "しかし、例がなければ何も意味しない。そして、私はSDKで作業しているので、すべての部分が独立している必要があります。 –

+0

私のちょっとした暴言については申し訳ありません。ありがとう、少なくとも私はこの問題の唯一の人ではないことを知っています。 –

0

あなたは上のパラメータとしてproviderreaderを追加することができます:)だけではありません知っていますOpenTable()

お電話はOpenTable()ですか?呼び出し元はproviderreaderを知っているので、メソッドに渡すことができますか?

関連する問題