Заголовок, вероятно, не слишком хорошо описывает мою проблему, я буду рад, если кто-нибудь сможет отредактировать ее для чего-то более подходящего.В любом случае:
Я получил компонент, который должен возвращать цену продукта, учитывая его id
.Он реализует интерфейс, подобный следующему:
interface IProductPriceFetcher
{
double GetPrice(int id);
}
Теперь цену можно получить из 3 различных источников:
- веб-сервис
- непосредственно из исходного кода веб-сайта (утилизация)
- в качестве окончательного отката (и веб-сервис, и веб-сайт недоступны) возвращается самая последняя цена из локальной базы данных
Чтобы поиграть с этимПроблема с 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
, с дополнительным замечанием, что первые два могут завершиться с ошибкой и вернуть null
;Я предполагал, что GetLocalDatabaseFetcher
всегда будет возвращать значимый объект, хотя.
Мое "общее удивление ..."
После успешного вызова веб-сервиса / веб-сайта я хочу, чтобы выбранная цена была вставлена в локальную базу данных., как будущий запасной вариант.Теперь мой вопрос: какая часть кода выше должна отвечать за это?Должен ли он быть одним из конкретных веб-сборщиков, который возвращает цену?Или сборщик «агрегатор» (MainFetcher
), поскольку он также знает, что является источником цены?Должен ли я поднять какое-то событие?Вставить еще один интерфейс с вызовами БД?Изменить дизайн на более качественный?
Почему это вообще стало для меня проблемой?Ну, я попытался сохранить код чистым (не беспокойтесь, это всего лишь любимый проект для моего свободного времени - именно для решения подобных проблем), возможно, с учетом SRP / SoC.Теперь у меня, кажется, есть проблемы с переключением с этого мышления - я имею в виду, как может что-то, что выбирает веб-страницы, также делать вставки базы данных?О, давай!:)