私はDependency Injection の原則を実行しようとしていますが、そうするのに苦労しています。
定期的にデータベースにアクセスして製品のリストを取得し、それらの製品に対して一連のテストを実行して安全性を判断する機能があります。
1 つまたは複数の製品が安全でないことが判明した場合は、ProductRecall
オブジェクトをインスタンス化してディスパッチすることにより、リコールを発行する必要があります。
関数は次のようになります: (疑似コード)
void SafteyInspector::CheckProductSaftey()
{
database.getProducts( list_of_products )
foreach( list_of_products as p )
{
if ( !runBatteryOfTests( p ) )
unsafe_products.insert( p );
}
if ( !unsafe_products.empty() )
{
ProductRecall * recall =
new ProductRecall( unsafe_products ); // Oh no!
recall->dispatch();
}
}
ProductRecall
問題は、コールグラフの真ん中にあるオブジェクトを「新規」にしていることです。これは、依存性注入の原則に違反しています。書かれているように、オブジェクトCheckProductSaftey()
も作成しないとテストできません。ProductRecall
ただし、安全でない製品のリストを決定するのはオブジェクトであるため、オブジェクトProductRecall
をオブジェクトに渡すことはできません。SafetyInspector
SafetyInspector
私はすべてにコンストラクター注入を使用しており、引き続き使用したいと考えています。ProductRecalls
また、いつでも複数発行する可能性があるため、単一のProductRecall
オブジェクトをSafetyInspector
at 構造に渡すことは必ずしもできないことに注意してください。
助言がありますか?ありがとう!