タイトルが私の問題をうまく説明していない可能性があります。誰かがそれをより適切なものに編集できれば幸いです。いずれかの方法:
与えられた製品価格を返すはずのコンポーネントを取得しましたid
。次のようなインターフェイスを実装します。
interface IProductPriceFetcher
{
double GetPrice(int id);
}
現在、価格は3 つの異なるソースから取得できます。
- ウェブサービス
- ウェブサイトのソースコードから直接 (スクラップ)
- 最後のフォールバック (Web サービスと Web サイトの両方にアクセスできない) として、ローカル データベースからの最新の価格が返されます。
この 3 つの異なるソースの問題を回避するために、次のようなクラスを実装しました。
class MainFetcher : IProductPriceFetcher
{
public double GetPrice(int id)
{
var priceFetcher = this.factory.GetWebServiceFetcher()
?? this.factory.GetWebsiteFetcher()
?? this.factory.GetLocalDatabaseFetcher();
return priceFetcher.GetPrice(id);
}
}
もちろん、ファクトリからの各メソッドは戻りますIProductPriceFetcher
が、最初の 2 つは失敗して戻る可能性があることに注意してくださいnull
。私GetLocalDatabaseFetcher
は常に意味のあるオブジェクトを返すと仮定しました。
私の「一般的な疑問...メン」
Web サービス/Web サイトの呼び出しが成功したら、将来のフォールバック ケースとして、取得した価格をローカル データベースに挿入したいと考えています。私の質問は、上記のコードのどの部分がそれを担当する必要があるかということです。価格を返す具体的な Web フェッチャーの 1 つにすべきでしょうか? または、「アグリゲーター」フェッチャー ( MainFetcher
) は、価格のソースが何であるかについての知識も持っているため? イベントを発生させる必要がありますか?DB 呼び出しでさらに別のインターフェイスを挿入しますか? デザインをより良いものに変更しますか?
なぜそれが私の問題として発生したのですか?さて、私はコードをきれいに保とうとしました (心配しないでください。これは私の空き時間のためだけのペット プロジェクトです - まさにこのような問題を解決するためのものです) おそらく SRP/SoC を念頭に置いて。今、私はこの考え方から切り替えるのに問題があるようです-つまり、ウェブページを取得する何かがデータベースの挿入も行っている可能性があるのでしょうか? ああ、さあ!:)