2017-04-17 8 views
0

私はIFooという名前のインタフェースを持っています。このインタフェースの実装は、コンストラクタにFileInfoを受け取ります。問題は、私はそれが解決されるまでFooインスタンスに渡す必要があるFileInfoわからないですUnityを使用して、「モデル」を解決済みの型に渡す必要がありますか?

container.RegisterType<IFoo, Foo>(); 

:私のブートストラップでは、私はそれがこのように設定しています。私は1つを持って、コンストラクタに渡す必要があります。

以前の投稿では、パラメータの上書きと、container.Resolveの使用をお勧めしていますが、これは一般的に悪いことです。

私がする必要があることを達成するための推奨されるアプローチはありますか?

TLDR:私はそれが眉をひそめていない、このような何かをできるようにする必要があります:

container.Resolve<IFoo>(*pass my constructor arg here*) 

答えて

1

問題は、私は私が中を通過する必要があるのFileInfoかわからないということですFooインスタンスが解決されるまでインスタンス化します。

これは、アプリケーションのコンポーネント(あなたFoo)はランタイムデータ建設中を必要とすべきではないながらFileInfoは、ランタイムデータであることを意味します。

ランタイムデータが不良である理由とその解決策について詳しくはthis articleをお読みください。

+0

私はその結論に自分自身をもたらしました。オブジェクトを構築するのがどれほど難しいかを考えて、クラスの設計に根本的な問題があるかどうかを検討しました。私はコンストラクタから新しいメソッドに引数を移動し、問題は手軽に解決しました。セイジアドバイス。ありがとうございました。 –

+2

注意: 'FileInfo'をある種の' IFoo.Initialize(FileInfo) 'メソッドに移動した場合、コンポーネントは初期化時に実行時データを必要としますが、今度は[Temporal Coupling](http:// blog。 ploeh.dk/2011/05/24/DesignSmellTemporalCoupling/)も同様です。 – Steven

+0

問題のクラスはファイルIOを提供します。これは、標準のOpen、Read、Close操作を持つ単純化されたデシリアライザです。それだけです。時間的なカップリングの量は、私の考えでは受け入れられます。時間的結合を避けることは、最初にコンストラクタに 'FileInfo'を置くことになったのですが、この*特定の*では、時空間結合は2つの悪のうちの小さいものです。 (文章中の "時間的"を適切に使用するためのボーナスポイント!!) –

関連する問題