Рекомендуется ли этот метод загрузки данных в приложение C #?

Цель

Я хотел бы понять, если этот текущий метод Загрузка данных а также вставка данных в базу данных, которую я использую в настоящее время, следует избегать?

Код

Я разработал простое приложение, которое загружает и вставляет данные, вот и все.

Модель

public class Person
{
    public int PersonId { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

Служба базы данных

public interface IDatabaseService
{
    List<Person> GetPeople();
    void InsertPerson(Person person);
}

public class DatabaseService : IDatabaseService
{
    public List<Person> GetPeople()
    {
        using (MySqlConnection conn = new MySqlConnection("connection"))
        {
            string query = "SELECT * FROM People;";
            var details = conn.Query<Person>(query);

            return details.ToList();
        }
    }

    public void InsertPerson(Person person)
    {
        using (MySqlConnection conn = new MySqlConnection("connection"))
        {
            string query = "INSERT INTO People (Firstname, Lastname) VALUES (@Firstname, @Lastname);";
            conn.Execute(query, new { @Firstname = person.Firstname, @Lastname = person.Lastname });
        }
    }
}

ViewModel

public class MainViewModel
{
    // Property to be loaded with records
    public ObservableCollection<Person> People { get; set; }


    // Properties to create new Person
    public string Firstname { get; set; }
    public string Lastname { get; set; }

    // Contructor
    public MainViewModel()
    {
        // Create database service and assign it to the readonly property
        DatabaseService databaseService = new DatabaseService();
        _databaseService = databaseService;

        LoadData();

        InsertDataCommand = new RelayCommand(InsertData);
    }

    // Service
    private readonly DatabaseService _databaseService;

    // Load data method
    protected void LoadData()
    {
        if(People == null)
        {
            People = new ObservableCollection<Person>();
        }
        People.Clear();
        _databaseService.GetPeople().ForEach(record => People.Add(record));
    }

    // Command to add new Person
    public ICommand InsertDataCommand { get; }
    protected void InsertData(object param)
    {
        Person person = new Person()
        {
            Firstname = Firstname,
            Lastname = Lastname
        };
        _databaseService.InsertPerson(person);

        // Refresh
        LoadData();
    }
}

Вопрос

В моей модели представления, как я очищаю ObservableCollection и перезагружаю данные … это нормально?

2 ответа
2

Несколько быстрых замечаний:

  • PersonIdPerson) ИМХО не отличный шаблон. IMHO вы не должны префикс имени свойства с именем класса.

  • IDatabaseService далеко не общее имя. Я бы использовал PersonService и используйте этот класс для обработки всех Person-связанные запросы. Тогда у вас могут быть более общие имена, например GetAll() вместо GetPeople().

  • Используйте описательные имена. details как в var details = conn.Query<Person>(query); неправильное имя.

  • Я не нахожу InsertPerson отличное название метода. Для меня это должно быть что-то вроде Create (вместе с Edit а также Delete или же Remove).

  • Почему ты делаешь это:

      DatabaseService databaseService = new DatabaseService();
      _databaseService = databaseService;
    

    Почему бы просто не сделать _databaseService = new DatabaseService();?

    (Также вы должны использовать Dependency Injection для внедрения такой службы.)

  • Не размещайте бессмысленные комментарии повсюду. Комментарии должны быть редкими и использоваться только для объяснения того, почему что-то реализовано именно так. Если вам нужен комментарий // Load data method это означает, что имя вашего метода недостаточно ясно.

  • Я понимаю вашу точку зрения, но в целом .Clear() тогда .ForEach(...Add(record)) это нормально использовать?

    — Белка.98

Добавить Repository слой, который будет между Data а также Service слои. Никогда не использовать Service прямо к Data слой. В Service слой предположительно содержит бизнес-логику, которая будет применяться к Repository слой. Каждый Service может работать с одним или несколькими репозиториями, но каждый репозиторий должен работать только с одним объектом. Вот пример:

public class PersonRepository
{
    public List<Person> GetPeople() { /* Dapper code here */  }

    public void InsertPerson(Person person) { /* Dapper code here */  }
}

public class PersonService 
{
    private readonly PersonRepository _personRepo = new PersonRepository();
    
    public List<Person> GetPeople() 
    { 
        // if there is some business logic needed 
        // you can add it here 
        return _personRepo.GetPeople();
    }
    
    public List<Person> InsertPerson(Person person)
    { 
        // if there is some business logic needed 
        // you can add it here 
        _personRepo.InsertPerson(person);
    }   
}

Каждый Repository должен проверять объект на соответствие требованиям сущности (например, таблица базы данных).

Каждый Service должен проверить объект на соответствие требованиям бизнес-логики.

В вашей модели представления свойства класса должны быть наверху класса, а не между ними, и сначала сортировать их по частным свойствам, а затем — по общедоступным свойствам.

Эта часть :

 // Contructor
public MainViewModel()
{
    // Create database service and assign it to the readonly property
    DatabaseService databaseService = new DatabaseService();
    _databaseService = databaseService;

    LoadData();

    InsertDataCommand = new RelayCommand(InsertData);
}
   
// Load data method
protected void LoadData()
{
    if(People == null)
    {
        People = new ObservableCollection<Person>();
    }
    People.Clear();
    _databaseService.GetPeople().ForEach(record => People.Add(record));
}

можно упростить этим:

 // Contructor
public MainViewModel()
{
    _databaseService = new DatabaseService(); 
    LoadData();
    InsertDataCommand = new RelayCommand(InsertData); 
}

// Load data method
protected void LoadData()
{
    People = new ObservableCollection<Person>(_databaseService.GetPeople());
}

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *