Есть в базе таблица с результатами тестов
Как и обычно по навигационным свойствам осуществляется доступ к другой информации, к такой как фамилия, имя, название теста и т.д.
При создании модели отчета для некоторых тестов необходимо значение поля Grade5
конвертировать в строковой эквивалент. Например:
2 => "Уровень ниже базового"
3 => "Базовый уровень"
или
2 => "Не зачет"
5 => "Зачет"
Для разных тестов по разному и необходимо обеспечить эту гибкость при создании фабрики отчетов.
Много поигравшийся с паттерном Стратегия и Фабричный метод в итоге я наколдовал вот это:
public abstract class ParticipReport
{
public string Surname { get; set; }
public string Name { get; set; }
}
public class ParticipReportWithGrade : ParticipReport
{
public int Grade5 { get; set; }
}
public class ParticipReportWithLevel : ParticipReport
{
public string Level { get; set; }
}
public interface IParticipReportMaker
{
ParticipReport Create(int id, Dictionary<int, string> dict = null);
}
public class ParticipReportMaker : IParticipReportMaker
{
private MyDbConxtex _db = new MyDbConxtex();
public ParticipReport Create(int id, Dictionary<int, string> dict = null)
{
var result = _db.TestResult.Find(x => x.Id);
if (dict == null)
{
var gradeReport = new ParticipReportWithGrade();
gradeReport.Surname = result. ...Surname; //доступ к Surname по навигационным свойствам
gradeReport.Name = result. ...Name;
return gradeReport;
}
var levelReport = new ParticipReportWithLevel();
levelReport.Surname = result. ...Surname;
levelReport.Name = result. ...Name;
levelReport.Level = dict[result.Grade5];
return levelReport;
}
}
class Program
{
static void Main(string[] args)
{
var levels = new Dictionary<int, string>
{
{ 2, "Ниже базового" },
{ 3, "Базовый" }
};
var maker = new ParticipReportMaker();
var report = maker.Create(1, levels);
}
}
Я в продакшен этот код еще не пустил, но думаю работать он будет.
Две вещи в этом коде мне не нравятся с ходу:
Surname
и Name
в модели отчета.levels
в метод maker.Create()
. Хотелось бы как-то правильно инициализировать объект maker
. Ведь за раз я будут обрабатывать только один тип тестов (с конвертацией или без конвертацией Grade5
).На сколько дела хороши в выше приведенном коде и правильно ли реализован полиморфизм если нет возможности менять структуру БД?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Получаю имена нужных процессовВ label11 хранится имя процесса активного окна
День добрый! Есть форма с расположены на ней GridомКак правильнее организовать работу с одной формой и несколькими источниками List
Доброго времени сутокНеобходимо обновить Таблицу в Mysql, а вернее заменить одно значение в одной строке