Как и где хранить параметры конкретного объекта?

Делаю программку, которая ищет устройства по сети. По сети прилетает идентификатор устройства.

Устройств множество, характеристики их известны.

Например, есть модели устройств: device1. Он имеет 4 порта, один датчик вскрытия, 2 кнопки.

device2: 3 порта, 2 датчика, 4 кнопки.

Как лучше хранить в такие устройства в программе?

  1. Насоздавать экземпляров класса с заданными свойствами.
  2. Десериализовывать из файла.
  3. В Бд (бд будет присутствовать для других задач тоже).

По первому пункту тут скорее надо не экземпляр, а сам класс с дефолтными доступными только для чтения значениями свойств. Поскольку экземпляров может быть много. Свойства будут одинаковые, будут разные Ip адреса, как минимум.

Еще важно, чтоб можно легко добавлять в базу устройств новое, без пересбора программы. Поэтому похоже. Первый вараинт не очень.


Ответы (1 шт):

Автор решения: dmitriy

Нашел отличное решение для себя. Использование паттерна прототип (в примере клонирование через сериализацию) + фабрика. Видео с Ютуба

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);
}
→ Ссылка