Я работаю над проектом C#, где я хочу достичь следующего поведения:
[*] У меня есть классы c1 to cn с конкретной допустимой комбинацией для их свойств.
[*] Действительные комбинации свойств хранятся в базе данных < /li>
Я хочу, чтобы каждый класс C1 до Cn имел уникальный экземпляр для каждой допустимой комбинации свойств.
Все действительные экземпляры должны быть загружены из доступ к одной базе данных. > Структура базы данных выглядит следующим образом: < /p>
Код: Выделить всё
Table C1
P1 P2 P3 P4
---------------
1 1 1 1
2 1 1 1
3 1 1 3
...
Вот псевдокод моей реализации:
Код: Выделить всё
public static class Info
{
private static List ValidC1s = new();
...
private static List ValidCns = new();
private static bool initialized = false;
static Info()
{
foreach (Ci valid property combination)
ValidCis.Add(Ci.Get(validProperties));
initialized = true;
}
// for each Ci
public static Ci? GetCi(Properties properties)
{
return ValidCis.SingleOrDefault(x => x.Properties == properties);
}
}
public class Ci
{
private Ci(Properties properties)
{
this.Properties = properties;
}
public static Ci Get(Properties properties)
{
if (Info.Initialized)
{
Ci ci = Info.GetCi(properties);
if (ci==null) throw Exception;
return ci
}
else
{
return new Ci(properties);
}
}
public Properties Properties { get; }
}
Я предполагаю, что вызов info.initialized в функции cis 'get убедитесь, что экземпляры создаются только из класса Info.
Однако CHATGPT выразил обеспокоенность по поводу безопасности потока, если другие поток доступны до завершения инициализации. Я не знаю, как проверить такой сценарий, поэтому мой вопрос: < /p>
Вопросы < /strong>
мой подход защищен и правильный? Br /> Если нет, то какой бы лучший способ реализовать такое поведение? < /p>
Подробнее здесь: https://stackoverflow.com/questions/794 ... rty-combin