Это один из тех сценариев, когда «Паралич по анализу», похоже, имеет место, поэтому совет, пожалуйста!
Проект
Достаточно простой список автомобильных продуктов, который включает такие детали, как ссылки на детали, какие автомобили они подходят и т. Д.
Внешний интерфейс - это приложение MVC asp.net.
Бэкэнд - SQL, использующий Subsonic для проецирования продуктов в доменные объекты.
Функциональность
Один из наших экранов - это экран сведений о продукте. ASP.NET MVC Controller вызывает репозиторий продукта для получения сведений о продукте и возвращает эти данные (посредством некоторого автоматического преобразования в viewModel) в представление.
Теперь убийственная деталь в том, что у нас есть два или три канала на веб-сайте, в зависимости от канала, пользователю необходимо видеть разные номера деталей.
Допустим, например, что если это канал Retail, то номера деталей такие же, как в базе данных, но если пользователь пришел на сайт через канал Trade, начало ссылки на деталь заменяется альтернативными номерами.
например. 0900876 при просмотре через канал торговли становится 1700876.
Я пытаюсь решить, где инкапсулировать «Правила канала» в отношении ссылок на детали (и других деталей, которые могут измениться).
Я рассмотрел эти альтернативы.
Запись логики непосредственно в объект домена
В классе Product у нас может быть метод / свойство для получения переведенной ссылки на деталь.
public string TranslatedPartRef()
{
if (this.Channel == "Trade")
{
return PartRef.Replace("0900", "1700");
}
else
{
return PartRef;
}
}
В этом сценарии экземпляр Product должен знать о канале, что мне кажется неправильным.
Инкапсулировать логику в другом объекте
Мы могли бы написать класс для обработки ссылки на эту часть или создать класс Channel , содержащий эту логику.
Однако я не понимаю, как координировать эти два класса.
Если контроллер вызывает хранилище для извлечения Продукта, то должен ли он определить, какой канал использовался, и перевести ссылку на деталь? если да, то как мне отправить продукт с переведенной ссылкой на деталь обратно в представление?
Стоит также отметить, что эта ссылка на деталь должна отображаться и в результатах поиска, и в других сценариях, поэтому я думаю, что она должна содержаться где-то в домене.