Цель
Я хотел бы понять, если этот текущий метод Загрузка данных а также вставка данных в базу данных, которую я использую в настоящее время, следует избегать?
Код
Я разработал простое приложение, которое загружает и вставляет данные, вот и все.
Модель
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 ответа
Несколько быстрых замечаний:
PersonId
(вPerson
) ИМХО не отличный шаблон. 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
это означает, что имя вашего метода недостаточно ясно.
Добавить 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());
}
Я понимаю вашу точку зрения, но в целом
.Clear()
тогда.ForEach(...Add(record))
это нормально использовать?— Белка.98