Исходные условия:
Есть модель велосипеда, обладающая рядом фиксированных параметров. Кроме исходных параметров модели должна быть возможность вручную добавлять новые параметры модели.
Ситуация:
Каждый параметр в базе данных представлен следующими характеристиками:
В базе данных существует несколько справочных таблиц (Lookup Table). В каждой из таких таблиц представлены доступные единицы измерения.
В других справочных таблицах представлены названия параметров.
На экран для каждой модели должно выводиться название параметра, его значение и единицы измерения.
Вопросы:
Как лучше реализовать подобный подход на основе DDD? Не хочу усложнять модель предметной области, перетаскивая в нее подход, используемый в Базе данных, которая вообще не должна влиять на модель.
Примечания:
Изначально до ознакомления с базой данных я считал, что параметры в модели должны быть представлены набором свойств, например:
// Модель велосипеда
public class BikeModel {
public BikeModel(string name, double height, double width) {
ChangeName(name);
ChangeHeight(height);
ChangeWidth(width);
}
// Название модели велосипеда
public string Name { get; private set; }
// Длина велосипеда
public double Height { get; private set; }
// Ширина велосипеда
public double Width { get; private }
public void ChangeName(string name) {
Name = name;
}
public void ChangeHeight(double height) {
Height = height;
}
public void ChangeWidth(double width) {
Width = width;
}
}
Однако ознакомившись с базой данных я понял, что под значением "Параметр" скрывается ряд характеристик, представленных в разделе "Ситуация". Получается, что параметр можно представить Generic-классом.
public class ParameterOfModel<T> {
public ParameterOfModel(string name, T value, string units) {
SetName(name);
SetValue(value);
SetUnits(units);
}
// Название параметра
public string Name { get; private set; }
// Значение параметра
public T Value { get; private set; }
// Единицы измерения параметра
public string Units { get; private set; }
public void SetName(string name) {
Name = name;
}
public void SetValue(T value) {
Value = value;
}
public void SetUnits(string units) {
Units = units;
}
}
В таком случае модель велосипеда примет следующий вид:
// Модель велосипеда
public class BikeModel {
public BikeModel(string name, double height, double width) {
ChangeName(name);
ChangeHeight(height);
ChangeWidth(width);
AdditionalNumericParams = new List<ParameterOfModel<double>>();
}
// Название модели велосипеда
public string Name { get; private set; }
// Длина велосипеда
public ParameterOfModel<double> Height { get; private set; }
// Ширина велосипеда
public ParameterOfModel<double> Width { get; private set; }
// Дополнительные числовые параметры
public List<ParameterOfModel<double>> AdditionalNumericParams { get; private set; }
public void ChangeName(string name) {
Name = name;
}
public void ChangeHeight(double height) {
Height = new ParameterOfModel<double>("Высота велосипеда", height, "Сантиметры");
}
public void ChangeWidth(double width) {
Width = new ParameterOfModel<double>("Ширина велосипеда", width, "Сантиметры");
}
// Добавить в модель дополнительный параметр
public void AddNewNumericParam(ParameterOfModel<double> additionalParameter) {
AdditionalNumericParams.Add(additionalParameter);
}
}
Но как собирать такой параметр, используя справочные таблицы?
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости