Страницы

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

среда, 5 декабря 2018 г.

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

Я пытаюсь спроектировать приложение реализующее паттерн 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 не вариант.


Ответ

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: В коде могут быть ошибки, т.к. часть кода писал прямо тут, но для объяснения концепции этого должно быть достаточно.

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

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