Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Как правильно передавать данные из Model во View через Presenter при использовании EF, CodeFirst, Linq?

#c_sharp #winforms #entity_framework #mvp


Я пытаюсь спроектировать приложение реализующее паттерн MVP на WinForms.

При этом я использую EF+CodeFirst+Linq

На View есть DataGridView, который нужно заполнить данными. View вызывает метод Select()
класса Presenter, который в свою очередь вызывает метод Select() класса Model.

Как правильно предать полученные из БД данные обратно в Presenter, чтобы тот вставил
их во View? 

Через возврат значения не получается т.к. используется using. Отказываться от using?

Реализация Model.Select()

    internal void Select()
    {
        using (GoodsContext context = new GoodsContext())
        {
            var items = from Items in context.Goods
                        select Items;
        }
    }


UPD:

Уходить от Linq не вариант.
    


Ответы

Ответ 1



Model Entity: public class Customer { public string Name { get; set; } public string Address { get; set; } public string Phone { get; set; } public override bool Equals(object obj) { Customer other = obj as Customer; return Equals(other); } public override int GetHashCode() { return Name.GetHashCode() ^ Address.GetHashCode() ^ Phone.GetHashCode(); } public bool Equals(Customer other) { if (other == null) return false; return this.Name == other.Name && this.Address == other.Address && this.Phone == other.Phone; } } //На самом деле для объяснения не было необходимости расписывать поля и переопределять методы, но решил добавить, т.к. многие это не делают, и еще хуже не знают зачем Интерфейс репозитория: public interface ICustomerRepository { IEnumerable GetAllCustomers(); Customer GetCustomer(int id); ... } Реализация репозитория internal class CustomerRepository : ICustomerRepository { private readonly DbContext dbContext = new DbContext(); IEnumerable GetAllCustomers() { return dbContext.Set().ToList(); } Customer GetCustomer(int id) { return dbContext.Set().SingleOrDefault(e => e.Id == id) } ... } Presenter public class CustomerPresenter { private readonly ICustomerView _view; private readonly ICustomerRepository _repository; public CustomerPresenter(ICustomerView view, ICustomerRepository repository) { _view = view; view.Presenter = this; _repository = repository; UpdateCustomerListView(); } private void UpdateCustomerListView() { var customerNames = from customer in _repository.GetAllCustomers() select customer.Name; int selectedCustomer = _view.SelectedCustomer >= 0 ? _view.SelectedCustomer : 0; _view.CustomerList = customerNames.ToList(); _view.SelectedCustomer = selectedCustomer; } public void UpdateCustomerView(int p) { Customer customer = _repository.GetCustomer(p); _view.CustomerName = customer.Name; _view.Address = customer.Address; _view.Phone = customer.Phone; } ... } View интерфейс вьюхи public interface ICustomerView { IList CustomerList { get; set; } int SelectedCustomer { get; set; } string CustomerName { get; set; } string Address { get; set; } string Phone { get; set; } Presenter.CustomerPresenter Presenter { set; } } Реализация интерфейса вьюхи internal partial class CustomerForm : Form, ICustomerView { private bool _isEditMode = false; public CustomerForm() { InitializeComponent(); } public IList CustomerList { get { return (IList)this.customerListBox.DataSource; } set { this.customerListBox.DataSource = value; } } public int SelectedCustomer { get { return this.customerListBox.SelectedIndex; } set { this.customerListBox.SelectedIndex = value; } } public string Address { get { return this.addressTextBox.Text; } set { this.addressTextBox.Text = value; } } public string CustomerName { get { return this.nameTextBox.Text; } set { this.nameTextBox.Text = value; } } public string Phone { get { return this.phoneTextBox.Text; } set { this.phoneTextBox.Text = value; } } public Presenter.CustomerPresenter Presenter { private get; set; } private void customerListBox_SelectedIndexChanged(object sender, EventArgs e) { try { Presenter.UpdateCustomerView(customerListBox.SelectedIndex); } catch(Exception e) { //логирование ошибки } } } PS: В коде могут быть ошибки, т.к. часть кода писал прямо тут, но для объяснения концепции этого должно быть достаточно.

Комментариев нет:

Отправить комментарий