Как и где хранить параметры конкретного объекта?
Делаю программку, которая ищет устройства по сети. По сети прилетает идентификатор устройства.
Устройств множество, характеристики их известны.
Например, есть модели устройств: device1. Он имеет 4 порта, один датчик вскрытия, 2 кнопки.
device2: 3 порта, 2 датчика, 4 кнопки.
Как лучше хранить в такие устройства в программе?
- Насоздавать экземпляров класса с заданными свойствами.
- Десериализовывать из файла.
- В Бд (бд будет присутствовать для других задач тоже).
По первому пункту тут скорее надо не экземпляр, а сам класс с дефолтными доступными только для чтения значениями свойств. Поскольку экземпляров может быть много. Свойства будут одинаковые, будут разные Ip адреса, как минимум.
Еще важно, чтоб можно легко добавлять в базу устройств новое, без пересбора программы. Поэтому похоже. Первый вараинт не очень.
Ответы (1 шт):
Нашел отличное решение для себя. Использование паттерна прототип (в примере клонирование через сериализацию) + фабрика. Видео с Ютуба
static class ExtensionMethods
{
public static Task<T> TryCreateDeepCopyAsync<T>(this T self)
{
if (self is null)
return default;
return self.TryCreateDeepCopyInternalAsync();
}
private static async Task<T> TryCreateDeepCopyInternalAsync<T>(this T self)
{
using (var stream = new MemoryStream())
{
await JsonSerializer.SerializeAsync(stream, self);
stream.Seek(0, SeekOrigin.Begin);
return await JsonSerializer.DeserializeAsync<T>(stream);
}
}
}
class Contact
{
public string Name { get; set; }
public Address Address { get; set; }
public override string ToString()
{
return $"Name: {Name}, Address: {Address}";
}
}
class Address
{
public string Street { get; set; }
public string City { get; set; }
public override string ToString()
{
return $"Street: {Street}, City: {City}";
}
}
static class EmployeeFactory
{
private static readonly Contact first = new Contact { Address = new Address { City = "Moskow", Street = "Lenina" } };
private static readonly Contact second = new Contact { Address = new Address { City = "Moskow", Street = "Arbat" } };
private static async Task<Contact> NewEmployeeAsync(string name, Contact prototype)
{
var result = await prototype.TryCreateDeepCopyAsync();
result.Name = name;
return result;
}
public static async Task<Contact> NewFirstEmployeeAsync(string name)
{
return await NewEmployeeAsync(name, first);
}
public static async Task<Contact> NewSecondEmployeeAsync(string name)
{
return await NewEmployeeAsync(name, second);
}
}
public async Task Test()
{
var person1 = await EmployeeFactory.NewFirstEmployeeAsync("Alex");
var person2 = await EmployeeFactory.NewFirstEmployeeAsync("Fil");
var person3 = await EmployeeFactory.NewSecondEmployeeAsync("Kate");
var person4 = await EmployeeFactory.NewSecondEmployeeAsync("Rob");
Debug.WriteLine(person1);
Debug.WriteLine(person2);
Debug.WriteLine(person3);
Debug.WriteLine(person4);
}